这已经在SO上出现了几次,但没有一个解决方案有效。这就是我目前所拥有的:
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
中的try_files
替换为@php
,则应将@php
位置用于URL / foo。
对于@php
位置,我尝试将SCRIPT_FILENAME
设置为:
fastcgi_param SCRIPT_FILENAME "/usr/share/nginx/html$uri.php";
fastcgi_param SCRIPT_FILENAME "$request_filename.php";
这些都没有奏效。
在调试时,没有add_header
行为URL / foo发送任何内容。 Content-Type总是设置为application / octet-stream,有趣的是,它总是设法发回php文件的内容(它被下载)。
我显然做错了什么,但我没看到。
答案 0 :(得分:4)
叹息。我知道如果我问这个,我会弄清楚的。好的,这就是解决方案:
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),但这是一种更好的方法。