我有以下 nginx 配置:
location / {
try_files $uri $uri/ index.html =404;
if (!-e $request_filename) {
rewrite ^/(.+)$ index.php?url=$1 last;
}
}
location ~ .php$ {
# protection from known vulnerability
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
(fastcgi_params
Debian 软件包的默认设置)
它适用于请求/
,但是当重写请求时找不到主文件:
请求/contact
应该重写为/index.php?url=contact
*104 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 10.0.0.1, server: localhost, request: "GET /contact HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "localhost:8080"
我无法从日志中获取 fastcgi 实际尝试加载的内容、哪条路径?
答案1
请注意index.php
和/index.php
是不同的 URI。您在重写时忘记了斜线。
答案2
这是实现相同功能的更好方法:
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.+)$ /index.php?url=$1 last;
}
然后按照您的设置中的 PHP 位置块进行操作。
try_files
首先检查与 $uri 匹配的文件是否存在,然后检查目录,如果都不存在,则使用 rewrite -location 运行脚本。
您的设置无法正常工作的最可能原因是缺少/
重写脚本路径。无论如何,此设置更简单,是 nginx 的首选设置。