Nginx位置匹配除php以外的所有文件扩展名
我的nginx配置文件中有以下内容,它可以工作,但我不想列出每个文件扩展名Nginx位置匹配除php以外的所有文件扩展名,nginx,Nginx,我的nginx配置文件中有以下内容,它可以工作,但我不想列出每个文件扩展名 location ~ \.(gif|jpg|png|css|js|ttf|woff|html|htm|unity3d) { try_files $uri /images/default.gif; } 有没有一种方法可以将其应用于除php文件之外的所有内容 编辑:更新配置 主文件: server{ listen 80 default_server; server_name _; r
location ~ \.(gif|jpg|png|css|js|ttf|woff|html|htm|unity3d) {
try_files $uri /images/default.gif;
}
有没有一种方法可以将其应用于除php文件之外的所有内容
编辑:更新配置
主文件:
server{
listen 80 default_server;
server_name _;
root /usr/share/nginx/html/$http_host;
index index.php index.html index.htm;
# location ~ \.(gif|jpg|png|css|js|ttf|woff|html|htm|unity3d|tpl) {
# try_files $uri /images/default.gif =404;
# }
location ~ .+(?<!\.php)$ {
location ~ ^[^.]+\.[^.]+$ {
try_files $uri /images/default.gif =404;
}
location ~ / {
try_files $uri $uri/ /index.html;
include /usr/share/nginx/conf/mission13.io.conf;
}
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
PCRE图书馆
Nginx使用用C编写的。
有一个巨大的,有时有点难以理解,但非常详细。
在这些函数中,您可以找到与Perl中相同的“向前看/向后看”功能
正向/负向前瞻/后向
如果字符串的一部分后跟/未后跟/未后跟表达式,则正/负向前/向后查找允许匹配该字符串。Look-behind表达式被限制为固定字符串,因为大多数实现不可能向后应用正则表达式,因为您需要知道为此返回了多少步。前瞻性显然不会受到这种限制,所以您可以像通常一样使用正则表达式
以下是手册页的相关部分:
前向和后向断言
(?=...) positive look ahead
(?!...) negative look ahead
(?<=...) positive look behind
(?<!...) negative look behind
Each top-level branch of a look behind must be of a fixed length.
就这样
你的第二期
以下是我在您发布更新后对您面临的第二个问题(其他URL上的404个错误)的评论
由于~.+(?匹配除\.php$
之外的所有内容,并且位置是嵌套的,因此需要嵌套位置块/
,并将其转换为正则表达式匹配:
location ~ .+(?<!\.php)$ {
location ~ ^[^.]+\.[^.]+$ {
try_files $uri /images/default.gif;
}
location ~ / {
# your stuff
}
}
location~.+(?
还要注意的是,由于try\u files
指令的最后一个参数是内部重定向或HTTP代码,因此,如果/images/default.gif
没有解析为文件,请求将通过此位置块再发送10次直到nginx停止处理并返回HTTP 500。因此,将其更改为try_files$uri/images/default.gif=404;
非常好!但是当我尝试点击主页(site.com/home
)以外的页面时,我得到了404。我在问题中添加了我的完整配置。@RyanNaddy请检查我的第二个问题的答案更新。好的,现在当我点击页面时,它下载了文件而不是显示它。我用新的配置文件更新了问题。@RyanNaddy为什么将处理以.php
结尾的请求的位置嵌套在位置th下at会过滤所有内容,但不会过滤以.php
结尾的请求?只需嵌套/
位置。使用此设置,php位置永远不会到达,因此nginx会尝试在服务器块根路径中提供php文件,因为它是静态文件。也许我们可以讨论另一个问题,因为这是一个常见问题。orig最后一个问题是在线测试,我觉得最好还是保留原来的帖子和答案,因为它越来越难阅读,而且随着更新,这个问题也发生了很大的变化。
location ~ .+(?<!\.php)$ {
...
}
location ~ .+(?<!\.php)$ {
location ~ ^[^.]+\.[^.]+$ {
try_files $uri /images/default.gif;
}
}
location ~ .+(?<!\.php)$ {
location ~ ^[^.]+\.[^.]+$ {
try_files $uri /images/default.gif;
}
location ~ / {
# your stuff
}
}