nginxにpath_をサポートさせるinfo
2641 ワード
PATH_INFOはCGI 1.1の標準であり、よく伝参担体として用いられる.
例えばPATH_を使ってINFOはRewriteの代わりに擬似静的ページを実現し,また多くのPHPフレームワークもPATH_を使用している.INFOはルーティングキャリアとして機能する.
Apacheでは、コンフィギュレーションを追加しない場合、PHPスクリプトの場合、AcceptPathInfoはデフォルトで受け入れられます.つまり、次のようになります.
サーバに/laruence/indexが存在する場合.php
では、次のようなお願いに対して
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には、一般的に次のデフォルト構成セグメントがあります.
したがって、/laruence/infoのような形については.php/pathinfoのようなファイルパスは、Nginxがphp cgiサーバに正しく渡すことはありません.この構成を書き換える必要があります
現在、スクリプトパスは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項で良い:
今やってみよう...
btw:もちろん、上記の解決策は、経路の分析をPHPに渡して処理し、ネット上にはNginxが経路を分析する別の構成方法がある(fix_pathinfoは必要ない):
後で、最近発見した1つのセキュリティホール(Nginx+PHP CGIの1つの可能なセキュリティホール)はこの配置と関係があり、家事は必ず第2の配置を使用する時、cgiを閉じてください.fix_pathinfo. また、この脆弱性については個人的にはNginxとは関係なく、Nginxの脆弱性ではないと思います.配置の問題ですが、今はあちこちでNginxのBugと言っていますが、妥当ではありません.
例えば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と言っていますが、妥当ではありません.