每当我在url nginx中放入一个已知的文件扩展名时返回404 Not Found
。
domain.com/myroute.foo
和domain.com/foo/myroute.foo
没问题,但domain.com/myroute.php
和domain.com/foo/myroute.php
(或例如.css,.js)会返回404 Not Found
。
我的nginx服务器配置:
server {
listen 80;
server_name domain.com;
root /var/www/path/public;
charset utf-8;
gzip on;
#access_log logs/host.access.log main;
location / {
index index.html index.php index.htm;
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
add_header Cache-Control public;
add_header Cache-Control must-revalidate;
expires 7d;
access_log off;
}
}
为什么具有已知文件扩展名(/myroute.php
)的网址不会像其他任何网址一样发送到我的index.php
文件?
答案 0 :(得分:5)
myroute.php
在您的服务器上不存在。
按此顺序检查Nginx location
指令
- 带有“=”前缀且与查询完全匹配的指令(文字字符串)。如果找到,则搜索停止。
- 使用传统字符串的所有剩余指令。如果此匹配使用“^〜”前缀,则搜索停止。
- 正则表达式,按照在配置文件中定义的顺序。
- 如果#3产生匹配,则使用该结果。否则,使用#2的匹配
醇>
这意味着您的myroute.php
请求由~ \.php$
位置块处理,根据您的try_files指令生成404.
要解决此问题,您需要使您的位置指令更具体(例如~ index\.php$
),或者像location /
中那样使用try_files。使用重写也可以解决您的问题。
编辑:
了解nginx选择位置块的顺序与其他位置块的关系非常重要。请参阅nginx wiki
了解更多信息关于你的问题,我认为最简单的解决方案是使用try_files
try_files $uri $uri/ /index.php?q=$uri&$args;
在location ~ \.php$ {
和location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
块中
try_files $uri =404
块.php$
您的最终配置文件现在应该如下所示
server {
listen 80;
server_name domain.com;
root /var/www/path/public;
charset utf-8;
gzip on;
#access_log logs/host.access.log main;
location / {
index index.html index.php index.htm;
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~ \.php$ {
try_files $uri $uri/ /index.php?q=$uri&$args;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
try_files $uri $uri/ /index.php?q=$uri&$args;
add_header Cache-Control public;
add_header Cache-Control must-revalidate;
expires 7d;
access_log off;
}
}