Nginx位置匹配除php以外的所有文件扩展名

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

我的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    _;
    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
    }

}