2016-11-03 9 views
1

私は単純なPHP RESTアプリケーションを作成しましたが、静的ファイルの提供に問題があります。.htaccess - PHPファイルとして扱われた画像ファイル

  • 公共
    • コンテンツ(ここにある静的ファイル)のindex.php
  • SRC
  • (私のアプリケーションのソース)
  • ベンダー(作曲を次のように私のディレクトリ構造は見えます依存関係)

ルートの.htaccess

RewriteEngine on 
RewriteRule ^$ public/ [L] 
RewriteRule (.*) public/$1 [L] 

公共の.htaccess(標準スリムテンプレート)

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^index.php [QSA] 

これらの設定:ルートディレクトリ内や公共のディレクトリに - 10私は私のプロジェクトに2つの.htaccessファイルを持っています私はすべてのリクエストをパブリックディレクトリにリダイレクトしたいと思っていたので、そのリクエストの部分を省略してhttp://host.com/rest/XXXを代わりにhttp://host.com/rest/public/XXXにする必要があったからです。

今私はhttp://host.com/rest/content/file-test.extを使用してファイルにアクセスすることはできません - 私はエラーを取得しているので、それはPHPファイルとして扱われているようにそれはそう:私はすでにRewriteEngine offかとコンテンツディレクトリ内の別々の.htaccessファイルを入れてみました

Warning: Unexpected character in input: '' (ASCII=30) state=0 in /rest/public/content/file-test.ext on line 298 

Parse error: syntax error, unexpected '@' in /rest/public/content/file-test.ext on line 298 

php_flags engine off

ホスティングは、私もすべての変更を要求することはできません第3部の人によって提供されているので、私は、任意のWebサーバの設定を変更することはできません。 host.com/rest私は私のドキュメントルートに設定すると、私はFTP経由で接続したときにウェブサーバの設定変更に関するソリューションは、私の場合には正しくないので、私はそのディレクトリから上方に行くことはできません。

静的ファイルが正常に動作するように手伝ってください。

+0

、なぜしないでください書き換えを行うのではなく、 '/ rest /'をルートに追加するだけです。そして、ちょうど '/公共/ content'を指すように' /休憩/ content'のエイリアスを設定しますか?一つの提案は、あなたのWebルートをパブリックフォルダに向け、ソースコードをWebルートの外側に置くことです。 –

+0

@MagnusEriksson - 私はすでに '/ rest/method'として指定されたルートを持っています。エイリアスはどういう意味ですか?スリム要求を特定のディレクトリに渡してファイルストリームを返す方法を知っていますか?私はパブリックディレクトリをコンテンツルートに設定することはできません。なぜなら、サーバーは私によって管理可能ではなく、その変更を要求する機会がないからです。 –

+0

Webサーバーにはパブリックフォルダがドキュメントルートとして設定されている必要があります。 –

答えて

1

Slimを利用する:手にコントロールを保持し、.htaccessで問題を解決しません。また

  • はあなたが希望するルートまたは含むフォルダをいつでも変更することができます。
  • 追加ヘッダーを設定することができます。キャッシングのために。 content/image.pngような場合のURLは
$app->get('/content/{pathToImage}', function($request, $response, $args) { 
    $pathToFile = $args['pathToImage']; 
    $containingFolder = '../content/'; // the actual folder where files are stored 
    // if you want to omit file extension in the url, we'll have to find it out 
    $matches = glob($containingFolder.$fileName.'.*'); 
    if ($matches) { 
     $clientImagePath = array_shift($matches); // let's grab the first file matching our mask 
     $clientImage = @file_get_contents($clientImagePath); 
     $finfo = new \Finfo(FILEINFO_MIME_TYPE); 
     $response->write($clientImage); 
     return $response->withHeader('Content-Type', $finfo->buffer($clientImage)); 
    } else { 
     // if no matches found, throw exception that will be handled by Slim 
     throw new \Slim\Exception\NotFoundException($request, $response); 
    } 
}); 

(ファイル拡張子を持つことは)あなたのために許容され、あなたは簡単な方法でこれを行うことができます:あなたがスリムを使用している場合

$app->get('/assets/images/{pathToImage}', function($request, $response, $args) { 
    $pathToFile = $args['pathToImage']; 
    $path = '../content/'.$fileName; 
    $image = @file_get_contents($path); 
    $finfo = new \Finfo(FILEINFO_MIME_TYPE); 
    $response->write($image); 
    return $response->withHeader('Content-Type', $finfo->buffer($image)); 
}); 
+1

ありがとうございました!期待どおりの仕事。私は存在しないファイルの検証を追加する必要があります:)素晴らしい解決策! –

関連する問題