2016-04-22 20 views
19

NGINXで静的HTMLファイルを提供したいが、ファイルが見つからない場合、代わりにPHPファイルをロードし、PHPがその内容を処理する必要があります。動的前に静的ページを提供するNginx

私はtry_filesのいくつかの組み合わせをテストしていますが、私はそれの周りに頭を上げることはできません。である必要があり、各ページへの閲覧の

<?php 

$path = $_SERVER['REQUEST_URI']; 
$pattern = '/^\/(.*)\.html$/'; 

$matches = []; 

$results = preg_match($pattern, $path, $matches); 

if (count($matches) > 0) { 
    if ($matches[1] == "dynamic") { 
     require 'dynamic.php'; 
    } else { 
     echo "Not found!"; 
    } 
} else { 
    echo "Index page!"; 
} 

結果:

./ 
../ 
dynamic.php 
index.php 
static/ 
static/static.html 

は、その後、私はこのような指標に小さなPHPコードを持っている:私はこのようになりますダミーPHPアプリを持っています

http://foo.bar/    - Loads index.php 
http://foo.bar/static.html - Loads static/static.html 
http://foo.bar/dynamic.html - Loads index.php & PHP requires dynamic.php 
http://foo.bar/baz.html  - Loads index.php with "not found" message 

これは私がnginxの設定ファイルで得たものである:

server { 
    listen 80; 
    server_name .foo.bar *.foo.bar; 

    access_log /var/log/nginx/foo.access.log; 
    error_log /var/log/nginx/foo.error.log; 

    root /var/www/foo; 
    index index.php; 

    location/{ 
     # Trying with 'try_files' here. No success. 
    } 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
} 

私は全くこの行で失敗を繰り返すと明らかにしようとしてきた:

try_files $uri $uri/static /index.php; 

私は何かが欠けています。助けて?

+0

は、それはあなたのケースで書き換え、いくつかのURLを行いますが、PHPのすべての時間を使用して、表示されたページを処理することはできませんか? – AntoineB

答えて

5

静的ディレクトリをドキュメントルートとして使用します。これにより誰も/dynamic.phpを直接実行することはできませんが、名前付きロケーションブロック@phpによってindex.phpに転送されます。

この設定例はテストされていません!

server { 
    index  index.php; 
    root  /var/www/foo/static; 
    server_name foo.bar *.foo.bar; 

    location/{ 
     try_files $uri @php; 
    } 

    location @php { 
     include fastcgi_params; 

     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /var/www/foo/index.php; 
    } 
} 
  1. それが唯一の80が含まれている場合、これがデフォルトですので、あなたはlistenディレクティブは必要ありません。
  2. server_nameには先頭のドットを入れてはいけません。
  3. $uriには、常に先頭のスラッシュ(たとえば/static.html)を含む要求されたURIが含まれており、nginxは呼び出し時にドキュメントルートをtry_files(たとえば/var/www/foo/static.html)の前に付けます。したがって、$uriの前にstaticディレクトリを設定する必要があります(例:/static$uri/var/www/foo/static/static.htmlになります)。
  4. この機能を使用していないため、fastcgi_split_path_infoは必要ありません。
  5. PHPの場所にあるtry_filesは、nginxが正しく転送することができません。 /dynamic.htmlの要求は.phpで終了しないため、try_filesは常に失敗します。
+0

'.example.com'または' example.com * .example.com'です。両方の組み合わせの使用は意味をなさない。 – Fleshgrinder

+0

実際には、そこに 'dynamic.html'ファイルが存在せず、nginxがリクエストをphp-fpmに転送しないので、' @ php'の場所の中に 'try_files'を追加することはできません。しかし、あなたが言及した問題を考慮して設定を変更しました。 – Fleshgrinder

+0

申し訳ありませんが、私はあなたのポイント2を誤解していました。私はあなたが先頭のドットでサーバ名を使用してはならないと言っていると思っていました。私はあなたの分析に完全に同意します –

6

URLからstaticディレクトリを隠す方法はいくつかあります。例えば、rootを操作し、try_filesまたはrewriteを賢明に使用します。 nginxは、通常のファイル用のフォルダstaticが、.phpファイルの親フォルダに見えるように

root /var/www/foo; 

location/{ 
    root /var/www/foo/static; 
    try_files $uri /index.php; 
} 

location ~ \.php$ { ... } 

おそらく最も明白はこれです。存在をテストする前に、任意のURIに/staticを接頭辞ます

root /var/www/foo; 

location/{ 
    try_files /static$uri /index.php; 
} 

location ~ \.php$ { ... } 

:あなたが達成しようとしていた何

はこのようなものでした。 /index.phpは、別の場所で処理する必要があるため、最後の要素でなければなりません。詳細については、this documentを参照してください。

+0

私が作った間違いを指摘してくれてありがとうが、あなたの提案もうまくいきません。 '/'に行こうとすると '/ static /'にリダイレクトされ、 '/ static.html'に行くと'/static/'にリダイレクトされます。 =/ – Apollo

+0

@Apolloあなたの失敗モードは再現できませんが、最初の例に 'try_files'文を追加する必要がありました。 –

+0

@Apollo、あなたのコメントに記述されている失敗を得るためにこの答えの2つの例のどれを使用しましたか? – russell

1

あなたが指定した具体例に基づ​​いて、以下の設定では、リストした結果が返されます。ある

server { 
    listen 80; 
    server_name .foo.bar *.foo.bar; 

    access_log /var/log/nginx/foo.access.log; 
    error_log /var/log/nginx/foo.error.log; 

    root /var/www/foo; 
    index index.php; 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 

    location ~ /static { 
     rewrite ^/static\.html$ /static/ last; 
     index static.html; 
    } 
    location ~/{ 
     rewrite^/index.php last; 
    } 

...

http://foo.bar/    - Loads index.php 
http://foo.bar/static.html - Loads static/static.html 
http://foo.bar/dynamic.html - Loads index.php & PHP requires dynamic.php 
http://foo.bar/baz.html  - Loads index.php with "not found" message 
関連する問題