nginx + php-fpm没有.php扩展名

时间:2014-09-17 16:45:28

标签: php nginx

这已经在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文件的内容(它被下载)。

我显然做错了什么,但我没看到。

1 个答案:

答案 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),但这是一种更好的方法。