这在 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 文件的内容(它被下载)。
我显然做错了什么,但我没有看到什么。
叹。我知道如果我问这个,我会弄清楚的。好的,这里是,这是解决方案:
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),但这是一个更好的方法。
| 归档时间: |
|
| 查看次数: |
1713 次 |
| 最近记录: |