2016-07-22 5 views
1

/の前に、\.php$ロケーションディレクティブがスクリプトを受け取っていない理由を理解しようとしています。

以下は、nginxに使用している.confのサンプルです。 APIコードを実行しています。//domian.com/v#.#/endpoint/uri

私たちのdocument_rootはバージョン番号以下の1つのディレクトリです。 index.phpバージョンディレクトリ内に存在する:path/to/sites/public/v1.0/index.php

index index.php # <-- this is in here globally 
location ~ ^/(?<version>v[\d\.]+) { 
    try_files $uri $version/index.php?$args; 
    # Why does this NOT work? The/stopping \.php$ from matching 
    # try_files $uri /$version/index.php?$args; 
} 

location ~ \.php$ { 

    fastcgi_pass php56; 
    fastcgi_index index.php; 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include fastcgi_params; 
    [...] 
} 

私はあらゆる種類のものを試してみたが、この作業を取得するように見えることはできません。私は/を削除すると期待どおりに動作しますが、その後、私のSCRIPT_FILENAMEラインから変更します。

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

へ:

fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 

をそして、これは直接PHPファイルの呼び出しを破る - 私はしたくない何かを。

編集:解決策:次のように回答しました。この問題は、一致の順序と関係していました。パターンマッチングが最初に検出され、最後に検出されません。

注文を変更しました。最初にtry_filesに失敗しました。パターンが明示的に/で始まっているためです。

私が読んでいた:http://nginx.org/en/docs/http/request_processing.html

要求「/index.php」も、プレフィックスの場所にマッチしている「/」 最初にして、正規表現「(PHP)$。」によります。したがって、後者の場所によって処理されるのはであり、要求はlocalhost:9000で待機しているFastCGIサーバーに渡されます。

+0

最初の 'location'セクションで' index index.php'を試しましたか? – miken32

+0

あるいは、あなたの 'http'セクションだけで良いでしょう。 – miken32

+0

動作しません。私はグローバルな 'index'命令を持っています。私はここに1つを追加しました。 Nginxは '/ v1.0/index.php'ファイルを静的ファイルとして取り出し、それを完全に表示しています(application/oct ... streamのダウンロードデフォルトを防ぐために' default_type text/plain'をグローバルに追加しました)。 – guice

答えて

1

注意すべき最初のものは、正規表現の位置は、ファイルの順序で評価されることがあるので、/v1.1は、最初の位置ブロックと一致した場合、その後/v1.1/index.phpはまた、第一の位置ブロックと一致します。先頭に/がない不正なURIを作成することによって、間違った方法で問題を解決しているようです。

詳細はthis documentを参照してください。

あなたは、バージョン接頭辞を持つ.phpファイルはPHPブロックで処理できるようにするためにあなたのlocation ~ \.php$ブロック前に、あなたのlocation ~ ^/(?<version>v[\d\.]+)ブロックを配置する必要があります。

+0

さて、私は気になるでしょう。それはそれだった。ありがとう! "リクエスト" /index.php "は、接頭辞の場所"/"と最初に一致し、次に正規表現" \。(php)$ "と一致します。したがって、それは後者の場所で処理され、要求はlocalhost:9000 " - http://nginx.org/en/docs/http/request_processing.htmlでリッスンしているFastCGIサーバーに渡されます – guice

関連する問題