我基本上是试图实现 Apache MultiViews 行为,以便我的 URL 不需要 .php 扩展名。
据我从 Server Fault 上回答的其他问题中看到的那样,我应该已经解决了这个问题,但我的 nginx 配置显然有问题。
这种行为几乎是正确的;
- 我可以浏览
/path/to/app/
并且 index.php 文件被正确解析 - 我可以浏览
/path/to/app/function.php
并且文件被正确解析 - 我可以浏览
/path/to/app/media/some.jpg
,它作为静态内容提供 - 如果我浏览,
/path/that/doesnt/exist
就会得到预期的 404
但是,如果我浏览到/path/to/function
该try_files
指令,它会正确匹配,function.php
但会将其下载为静态文件。
这是配置文件:
server {
listen 80;
server_name app;
root /path/to/app;
index index.php index.html index.htm;
access_log /var/log/nginx/access.log;
location / {
allow all;
try_files $uri $uri/ $uri.php =404;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
}
location ~ /\.ht {
deny all;
}
}
答案1
看来我只是误解了 try_files 的工作方式;它=404
不是必需的,并且导致 nginx 在匹配后不将文件解析为 php。删除它,这样该行就try_files $uri $uri/ $uri.php;
解决了这个问题