这在SO上已经出现过几次了,但是没有一个解决scheme奏效。 这是我现在有:
location / { try_files $uri $uri/ $uri.php; } location @php { default_type application/x-httpd-php; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param QUERY_STRING $args; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location ~ \.php$ { #fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param QUERY_STRING $args; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
这个例子包含两个选项。 首先,第一节是通过最终位置节来推送URL / foo.php和URL / foo。 如果我用$uri.php
replace$uri.php
的try_files
中的$uri.php
,则应该使用URL / foo的@php
位置。
对于@php
位置我试图设置SCRIPT_FILENAME
为:
fastcgi_param SCRIPT_FILENAME "/usr/share/nginx/html$uri.php"; fastcgi_param SCRIPT_FILENAME "$request_filename.php";
这些都没有工作。
在debugging这个,没有add_header
行曾经发射任何URL /富。 内容types总是设置为应用程序/八位字节stream,并且,它总是设法返回php文件的内容(它被下载)。
我显然做错了什么,但是我没有看到什么。
叹。 我知道,如果我问这个问题,我会知道的。 好的,在这里,这是解决方案:
location / { try_files $uri $uri/ @php; } location @php { fastcgi_param SCRIPT_FILENAME "$document_root$uri.php"; fastcgi_param PATH_TRANSLATED "$document_root$uri.php"; fastcgi_param QUERY_STRING $args; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location ~ \.php$ { #fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
我在这里失踪的关键是fastcgi_param PATH_TRANSLATED "$document_root$uri.php";
线。 在这个问题中,我描述了一个场景,其中所有的PHP请求都经过了最后一节 – 这将避免需要中间节。 这是行不通的, @php
位置是需要的。
另外请注意,我切换到$document_root
。 一些讨论这个问题的问题使用了文档根目录的文本根目录而不是变量。 也许它不存在于旧版本的nginx(我使用1.4.6),但这是一个更好的方法。