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

Kev*_*yda 4 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;
    }
Run Code Online (Sandbox Code Playgroud)

此示例包含两个选项。首先,编写第一节以通过最终位置节推送 URL/foo.php 和 URL/foo。如果我将第一节$uri.php中的替换为,则它应该使用URL/foo的位置。try_files@php@php

对于@php我尝试设置的位置SCRIPT_FILENAME

     fastcgi_param SCRIPT_FILENAME "/usr/share/nginx/html$uri.php";
     fastcgi_param SCRIPT_FILENAME "$request_filename.php";
Run Code Online (Sandbox Code Playgroud)

这些都没有奏效。

在调试这个过程中,没有一add_header行为 URL/foo 发出任何内容。Content-Type 总是设置为 application/octet-stream ,有趣的是,它总是设法发回 php 文件的内容(它被下载)。

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

Kev*_*yda 5

叹。我知道如果我问这个,我会弄清楚的。好的,这里是,这是解决方案:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

我在这里缺少的关键是fastcgi_param PATH_TRANSLATED "$document_root$uri.php";线路。在问题中,我描述了一个场景,其中所有 php 请求都经过最后一节 - 这将消除对中间节的需要。那没用,@php需要位置。

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