nginxにpath_をサポートさせるinfo

2641 ワード

PATH_INFOはCGI 1.1の標準であり、よく伝参担体として用いられる.
例えばPATH_を使ってINFOはRewriteの代わりに擬似静的ページを実現し,また多くのPHPフレームワークもPATH_を使用している.INFOはルーティングキャリアとして機能する.
Apacheでは、コンフィギュレーションを追加しない場合、PHPスクリプトの場合、AcceptPathInfoはデフォルトで受け入れられます.つまり、次のようになります.
サーバに/laruence/indexが存在する場合.php
では、次のようなお願いに対して
/laruence/index.php/dummy
/laruence/dummy

Apacheはすべて受け入れて、すべてinfoに対してだと思っています.phpのアクセスは、PATH_を設定します.INFOはdummy
Nginxでは、PATH INFOはサポートされていません.つまり、PATH_はデフォルト設定されません.INFO.
一方、PHPに対するデフォルトプロファイルのサポートは基本的なものであるため、デフォルトプロファイルについても上記のアクセスは404であり、ファイルエラーが見つからないことを示す.
これはいくつかの使用に対してPATH_INFOが重要な情報を伝えるPHPフレームワーク(例えばKohana,Thinkphp)は、致命的だ.
この問題に対して、一般的には2つの解決方法があり、1つ目はrewriteを使うことですが、この方法の欠点も明らかで、PATH_INFOをQuery Stringに変換する.ここではこの方法について説明しません~
2つ目の方法は今日お話しするPATHのシミュレーションですINFO:
まず、Nginxでは、ファイル名の拡張子を一致させることでphp cgiサーバに渡すかどうかを決定することを知っています.nginxでconfには、一般的に次のデフォルト構成セグメントがあります.
location ~ .php$ {
     fastcgi_index  index.php;
     fastcgi_pass   127.0.0.1:9000;
     include        fastcgi_params;
}

したがって、/laruence/infoのような形については.php/pathinfoのようなファイルパスは、Nginxがphp cgiサーバに正しく渡すことはありません.この構成を書き換える必要があります
location ~ .php {//    
     fastcgi_index  index.php;
     fastcgi_pass   127.0.0.1:9000;
     include        fastcgi_params;
}

現在、スクリプトパスはPHP自身で処理する.どうやってPATHを増やしますか?INFOは?
まず、PHPのcgiを開く必要があります.fix_pathinfoコンフィギュレーションアイテム、このコンフィギュレーションアイテムを開くと、PHPはCGI仕様に従ってSCRIPT_をチェックします.FILENAMEの部分はアクセススクリプトとPATH_ですINFO(ini構成説明)、SCRIPT_によるNAMEがPATH_を修正するINFO(およびPATH_TRANSLATED)は正しい値(つまり、PHPが最初にCGI 1.1をサポートしていなかったことを示す)
そして、FASTCGIを1つ追加するだけでPARAM項で良い:
location ~ .php {
     fastcgi_index  index.php;
     fastcgi_pass   127.0.0.1:9000;
     include        fastcgi_params;
     fastcgi_param  PATH_INFO $fastcgi_script_name;
}

今やってみよう...
btw:もちろん、上記の解決策は、経路の分析をPHPに渡して処理し、ネット上にはNginxが経路を分析する別の構成方法がある(fix_pathinfoは必要ない):
location ~ \.php
{
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include      fastcgi_params;
     set $path_info "";
     set $real_script_name $fastcgi_script_name;
     if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
     set $real_script_name $1;
     set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}

後で、最近発見した1つのセキュリティホール(Nginx+PHP CGIの1つの可能なセキュリティホール)はこの配置と関係があり、家事は必ず第2の配置を使用する時、cgiを閉じてください.fix_pathinfo. また、この脆弱性については個人的にはNginxとは関係なく、Nginxの脆弱性ではないと思います.配置の問題ですが、今はあちこちでNginxのBugと言っていますが、妥当ではありません.