nginx+;不带.php扩展名的php fpm

nginx+;不带.php扩展名的php fpm,php,nginx,Php,Nginx,这已经出现过好几次了,但没有一个解决方案奏效。这就是我目前拥有的: location / { try_files $uri $uri/ $uri.php; } location @php { default_type application/x-httpd-php; fastcgi_param SCRIPT_FILENAME $request_filename; fastcg

这已经出现过好几次了,但没有一个解决方案奏效。这就是我目前拥有的:

    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。如果我用
@php
替换第一节
try_files
中的
$uri.php
,那么它应该使用URL/foo的
@php
位置

对于
@php
位置,我已尝试将
SCRIPT\u FILENAME
设置为:

     fastcgi_param SCRIPT_FILENAME "/usr/share/nginx/html$uri.php";
     fastcgi_param SCRIPT_FILENAME "$request_filename.php";
这些都不起作用

在调试过程中,没有任何
add_header
行为URL/foo发出任何消息。内容类型总是设置为application/octetstream,有趣的是,它总是设法发回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\u param PATH\u翻译的“$document\u root$uri.php”行。在这个问题中,我描述了一个场景,其中所有php请求都经过最后一节,这样就不需要中间一节了。这不起作用,需要
@php
位置

另外请注意,我切换到了
$document\u root
。讨论此问题的许多问题都使用文本文档根作为文档根,而不是变量。也许它在较旧版本的nginx中不存在(我使用的是1.4.6),但这是一种更好的方法