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

2023-11-21

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

然后在包含的文件中:

if ($http_host = groups.mission13.io) {
    rewrite ^(.+)$ /index.php?path=$1;
}

PCRE 图书馆

Nginx 使用PCRE文库用C写的。 有一个巨大的man page,有时有点难以理解,但很详细。 其中,您会发现前瞻/后顾功能,就像在 Perl 中一样。

积极/消极的向前/向后展望

如果字符串的一部分后面/前面没有表达式,则正向/负向前视/后视允许匹配字符串。后视表达式仅限于固定字符串,因为大多数实现不可能向后应用正则表达式,因为您需要知道为此返回了多少步。向前看显然不会受到这种限制,因此您可以像平常一样使用正则表达式。

这是手册页的相关部分:

前瞻和后瞻断言

     (?=...)         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.

不幸的是,您无法通过前瞻捕获字符串的结尾。

行动中回头看

因此,我们的第一次尝试将是从字符串末尾使用负向查找:

location ~ .+(?<!\.php)$ {
    ...
}

这意味着“仅捕获不以.php“。这与我们已经需要的非常接近。但是还需要添加更多内容才能使其按预期工作。

嵌套位置

事实上,没有任何东西可以保证此时您将拥有一个包含文件扩展名的字符串。更可能是anything except ^.+\.php$。为了确保这是一个真实的文件后缀,彻底改变此限制的自然方法是使用嵌套位置块,其中最受限制的部分是顶点。所以我们的配置现在如下所示。

location ~ .+(?<!\.php)$ {
    location ~ ^[^.]+\.[^.]+$ {
        try_files $uri /images/default.gif;
    }
}

就是这样!

你的第二期

以下是我在针对您面临的第二个问题(其他 URL 上的 404 错误)进行帖子更新后的评论。

As ~ .+(?<!\.php)$匹配所有内容,除了\.php$并且位置是嵌套的,需要嵌套位置块/并将其转换为正则表达式匹配:

location ~ .+(?<!\.php)$ {

    location ~ ^[^.]+\.[^.]+$ {
        try_files $uri /images/default.gif;
    }

    location ~ / {
        # your stuff
    }

} 

另请注意,您可能会陷入无限循环try_files $uri /images/default.gif;部分因为最后一个参数try_files指令是一个内部重定向或 HTTP 代码。因此,如果/images/default.gif不解析为文件,请求将再经过此位置块 10 次,直到 nginx 停止处理并返回 HTTP 500。因此将其更改为try_files $uri /images/default.gif =404;.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx 位置匹配除 php 之外的所有文件扩展名 的相关文章

  • 我怎样才能重写这个nginx“if”语句?

    例如 我想这样做 if http user agent MSIE 6 0 http user agent MSIE 7 0 etc etc rewrite ROOT ROOT ancient last break 而不是这个 if http
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • 如何在位置中使用 Nginx Regexp

    Web 项目将静态内容放入 some content img 文件夹中 url规则为 img some md5 但文件夹中的位置 content img 前两位数字 Example url example com img fe5afe048
  • 错误:从上游读取响应标头时上游过早关闭连接 [uWSGI/Django/NGINX]

    我目前在用户正在进行的查询中总是得到 502 它通常返回 872 行 在 MySQL 中运行需要 2 07 然而 它返回了大量信息 每一行包含很多东西 有任何想法吗 运行 Django tastypie Rest API Nginx 和 u
  • nginx 匹配位置中的特定单词

    我在匹配 nginx request body 变量中的特定单词时遇到问题 如果正文请求中有特殊单词 我想代理传递 所以我的方法是这样的 location php if request body proxy pass http test p
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • nginx位置正则表达式,匹配多次

    如何在 nginx 位置正则表达式中多次匹配 看来 x x 语法永远不起作用 例如 location abc w 1 3 从来不工作 您必须引用包含以下内容的位置 or 人物 location abc w 1 3 否则 nginx 将其解析
  • 使用nginx容器作为反向代理时的原始url

    我有一个 Web 应用程序部署为码头集装箱 我也有一个nginx容器 使用dnsmasq解析器 设置为充当 Web 应用程序前面的反向代理 它的 80 端口映射到主机 我的应用程序使用 SSO 身份验证 当我使用身份提供商登录时 回调 ur
  • Beanstalk 部署忽略 .ebextensions 中的 nginx 配置文件

    我在单实例 Elastic Beanstalk 环境中托管 Java Web 应用程序 并添加了几个 ebextension 文件 这些文件在每次部署时成功为我创建配置文件 然而 我无法找到一种方法让 Beanstalk 在 etc ngi
  • Kubernetes Ingress 在 nginx 反向代理后面运行

    我已经在可以从互联网访问的服务器上安装了 minikube 我创建了一个可用的 kubernetes 服务 gt kubectl get service myservice NAME CLUSTER IP EXTERNAL IP PORT
  • Docker 中的 NGINX 缓存 IP 地址并提供错误的 Content-Type

    Summary 我想让NGINX 不是NGINX Plus 通过使用变量从DNS名称重新解析IP地址proxy pass 如建议的这篇 Nginx 官方文章 在变量中设置域名 部分 https www nginx com blog dns
  • NGINX 上的 SSL 终止

    我已经购买了 SSL 证书 并在验证模数时正确地将其捆绑在一起 即https kb wisc edu middleware 4064 https kb wisc edu middleware 4064 那么哈希值是相同的 我已将证书和密钥移
  • 错误请求 400:nginx/gunicorn

    我已经遵循了这个教程 http blog wercker com 2013 11 25 django 16 part3 html http blog wercker com 2013 11 25 django 16 part3 html我现
  • 重定向而不是 404 错误页面 - 状态代码不起作用 (Nginx)

    我目前正在迁移到 nginx 服务器 我尝试将其放入名为的 404 ErrorDocument 中404 php 如果我现在尝试访问http mydomain com 404 php 这按预期工作 它将我重定向到 Google 但是一旦我尝
  • 是否可以使用 nginx 合并两个 json 响应?

    我有一个现有的快速端点 如下所示 app get route id async req res gt try const id req params id const result await dbFn id res send result
  • nginx 代理到子目录中的远程 Node.js Express 应用程序

    我完全陷入了这样一种情况 我想在一台服务器上拥有多个节点应用程序 通过让应用程序在不同的端口上运行 我可以正常工作 我可以通过输入 IP 地址和端口来访问应用程序 我想通过使用不同的子目录来代理来自 nginx 服务器的应用程序 如下所示
  • NGINX 和 Spark Java 之间的跨源通信

    我正在将 NGINX 和 Sparkjava 用于我的 Web 应用程序 我确信我已正确启用所有 CORS 标头 尽管如此 我还是得到了 XMLHttpRequest 无法加载http localhost 3003 platformAPI
  • Docker 网络 - nginx:[emerg] 在上游找不到主机

    我最近开始迁移到 Docker 1 9 和 Docker Compose 1 5 的网络功能来取代使用链接 到目前为止 通过链接 nginx 通过 docker compose 连接到位于一组中不同服务器中的 php5 fpm fastcg
  • Nginx 在子文件夹中重写 (404)

    我有一个网站主机NGINX曾经工作正常的服务器删除index php在 nginx 站点配置中使用try files 但现在我要在上面添加一个博客 其中 URL 将是www foo com blog 我可以访问博客并使用index php
  • 为什么需要将nginx中的$args重定向到index.php?

    许多 PHP 框架建议将其添加到 nginx location try files uri index php is args args 执行index php在所有 HTTP 请求上 为什么我需要 is args args 我觉得 arg

随机推荐

  • 导入错误:没有名为 lxml.etree 的模块

    我正在尝试在我的项目中导入预邮件程序 但它在 etree 导入中始终失败 我安装了 lxml 的 2 7 二进制文件 lxml 模块导入正常 如果我记录 lxml 模块 它会显示库文件夹的正确路径 但我无法从中导入 etree lxml 文
  • Java从文本文件中读取值

    我是 Java 新手 我有一个包含以下内容的文本文件 trace structure list a structure c 0 748701 0 243802 0 227221 0 752231 0 261118 0 263976 1 19
  • 在 Python 中处理多个文件时如何避免嵌套“with”语句

    当使用推荐的样式在 Python 中处理多个文件时 代码可能会变得丑陋 with open foo txt as foo with open bar txt w as bar with open baz txt w as baz Read
  • PHP 包含文件扩展名吗?

    对于 PHP 中必需 包含的文件 使用更好吗 inc扩展 vs inc php vs php扩展 有时人们使用 inc扩展 然后进行一些服务器配置以保留 inc通过网络浏览器访问文件 这might如果由知识渊博的系统管理员绝对正确地完成 那
  • 修剪所有数据库字段

    您知道 sql server 中是否有一种快速方法 通过 transact sql 可以修剪所有数据库字符串字段 没有光标 复制并粘贴输出 也适用于没有 varchar max 的 SQL 2000 如果需要 可以轻松扩展以将 GO 行添加
  • 如何显示当前登录的用户 Firebase

    mAuth FirebaseAuth getInstance mFirebaseDatabase FirebaseDatabase getInstance myRef mFirebaseDatabase getReference child
  • 分组函数(tapply、by、aggregate)和 *apply 系列

    每当我想在 R 中做一些 map py 的事情时 我通常会尝试使用apply家庭 然而 我一直不太明白它们之间的区别 如何 sapply lapply等 将函数应用于输入 分组输入 输出会是什么样子 甚至输入可能是什么 所以我经常会仔细检查
  • 如何读取 JMS 消息而不使用它们 - 使用 ActiveMQ

    我想知道是否有任何方法可以读取 jms 和 activemq 消息而不消耗它 我知道消息可以从队列中消费 但我仍然想问这个问题 您可以通过 JMS QueueBrowser 浏览队列上的消息 或者在 ActiveMQ 中您可以通过 JMX
  • 如果数据源不包含任何项目,如何在 ASP.NET C# 中隐藏转发器?

    我有一个 ASP NET 页面 它使用嵌套在另一个转发器中的转发器来生成数据列表 其作用如下
  • Pthread:为什么人们费心使用 pthread_exit?

    据我了解 当您需要终止具有返回值的线程时 pthread exit 完全等于 return 当人们可以使用一致的方式 即返回 来完成工作时 为什么 Pthread 定义这样一个重复的接口 我想到的两个原因 pthread exit 允许您从
  • 使用 Xamarin.Forms 和 Serilog 将日志写入文件

    您好 我在使用 Xamarin Forms NET Core 共享项目 和 Serilog 将日志写入 Android 设备上的文件时遇到问题 到目前为止 我已经在共享项目中安装了 Serilog 将 Serilog Serilog Sin
  • jstree select_limit 不起作用。我想设置选择限制以仅选择 3 个节点

    我的 jstree 函数在这里 我已经设定 select limit 3 但不起作用 当我运行时 我可以选择超过 3 个节点 但我需要选择不超过 3 个节点 var j1 jQuery noConflict j1 utree activit
  • sqlite3 带引号导入

    我正在尝试导入字段中包含引号的数据集合 它们目前是制表符分隔的 据我所知 根据文档 http www sqlite org cvstrac wiki p ImportingFiles sqlite shell 应该按字面解释引号 我认为这意
  • 我如何从 WordPress 中的每个类别中仅获取 1 个帖子

    我有一个名为新闻的类别 其中有许多子类别 我想要做的是从每个子类别 包括类别标题 帖子标题 附件图片 中仅获取 1 个帖子 最新 朋友们有什么建议吗
  • 如何使用 TIdHTTP 停止(取消)下载

    我正在使用TIdHTTP Get程序在一个线程中下载文件 我的问题是如何停止 取消 文件的下载 我会尝试通过抛出静默异常来取消它Abort方法中的TIdHTTP OnWork事件 此事件会在读 写操作时触发 因此在下载过程中也会触发该事件
  • 无法使用 has_secure_password、password_digest 错误

    晚上好 我有个问题 我在用has secure password导致我有一个错误undefined methodpassword digest for 但我没有这个方法 请帮忙 不知道该怎么办 我阅读了如何解决这个问题 但它对我没有帮助 这
  • MySQL 在日期时间列上选择 1 小时前或更新的记录

    我可以使用什么 where 子句来选择一小时前或更新的记录DATETIME时间戳 像这样的东西吗 我假设一个DATETIME timestamp是一个 DATETIME 字段 SELECT FROM table WHERE datetime
  • 如何将配置文件传递给scala jar文件

    我正在使用类型安全配置我的代码中包含库 然后生成一个 jar 文件 当我将 reference conf 文件嵌入到 jar 中时 该应用程序工作正常 但是是否可以将配置文件作为参数提供给 jar 例如 java DmyconfigFile
  • 向量迭代器不可解引用

    我有一个名为 Shape 的抽象基类 Circle 和 Rectangle 都是从中派生的 但是当我在 VS 2005 中执行以下代码时 我收到错误 调试断言失败 同时我没有在任何类中重载 运算符 表达式 向量迭代器不可解引用 这是什么原因
  • Nginx 位置匹配除 php 之外的所有文件扩展名

    我的 nginx 配置文件中有以下内容 它可以工作 但我不想列出每个文件扩展名 location gif jpg png css js ttf woff html htm unity3d try files uri images defau