我有以下 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 软件包的默认值)
它适用于 request /
,但是当请求被重写时,找不到主文件:
request/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 尝试加载的实际内容,哪个路径?
请注意,
index.php
和/index.php
是不同的 URI。你在重写时忘记了斜线。这是实现相同功能的更好方法:
然后是您的设置中的 PHP 位置块。
try_files
首先检查与 $uri 匹配的文件是否存在,然后是目录,如果都不存在,则使用运行脚本的 rewrite -location。您的设置不起作用的最可能原因是
/
重写脚本路径中缺少。无论如何,这种设置更简单,是 nginx 的首选。