Nginx 位置匹配特殊字符和编码 url 字符的正则表达式

2024-01-02

今天我已经尝试了很多事情,但我只是没有获胜。我的网站中有一个文件是偶然创建的,其中包含一个特殊字符。结果,Googlebot 已停止抓取 3 周,网站站长工具/搜索控制台不断通知我并希望重新测试网址。

我想要实现的就是配置 Nginx 以匹配以下请求并将它们重定向到正确的位置,但正则表达式让我难住了这一点。

未编码的 URL 字符串是:

/historical-rainfall-trends-south-africa-1921–2015.pdf

编码后的 URL 字符串为:

/historical-rainfall-trends-south-africa-1921%C3%A2%E2%82%AC%E2%80%9C2015.pdf

我怎样才能获得这些的位置匹配?

UPDATE:

我仍然失去了理智,我所尝试的一切都不起作用。 我在这里得到了与这个正则表达式的匹配 -https://regex101.com/r/3Lk2zr/3 https://regex101.com/r/3Lk2zr/3

但然后用这个

location ~ /.*[^\x00-\x7F]+.* { return 444; }

仍然给我一个 404 而不是 444

同样,我得到了与此的匹配 -https://regex101.com/r/80KWJ8/1 https://regex101.com/r/80KWJ8/1但是之后

location ~ /.*([^?]*)\%(.*)$ { return 444; }

给出的是 404 而不是 444 ????

也尝试过这个但仍然没有工作。来源:https://serverfault.com/questions/656096/rewriting-ascii-percent-encoded-locations-to-their-utf-8-encoded-equivalent https://serverfault.com/questions/656096/rewriting-ascii-percent-encoded-locations-to-their-utf-8-encoded-equivalent

location ~* (*UTF8).*([^?]*)\%(.*)$ { return 444; }

location ~* (*UTF8).*[^\x00-\x7F]+.* { return 444; }

临时解决方案

感谢@funilrys 以及这个如何在nginx中将所有包含特定字符串的请求重定向到404? https://stackoverflow.com/questions/17221408/how-do-i-redirect-all-requests-that-contains-a-certain-string-to-404-in-nginx

现在100%有效

location /resources { expires 3h; add_header Cache-Control 'must-revalidate, proxy-revalidate, max-age=10800'; location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 3h; add_header Cache-Control 'must-revalidate, proxy-revalidate, max-age=10800'; } location ~* \.(pdf)$ { expires 30d; add_header Cache-Control 'must-revalidate, proxy-revalidate, max-age=2592000'; if ($request_uri ~ .*%.*) { return 301 https://example.com/resources/weather-documents/historical-rainfall-trends-south-africa_1921_2015.pdf; } if ($request_uri ~ .*[^\x00-\x7F]+.*) { return 301 https://example.com/resources/weather-documents/historical-rainfall-trends-south-africa_1921_2015.pdf; } }


你的解决方案很糟糕,让我告诉你原因。

现在,与该位置块匹配的每个请求都必须在提供服务之前根据两个 if 条件进行评估。

任何匹配的请求都会被重定向到正确的 url,该 url 也与此位置块匹配,因此现在您的服务器正在对这些 if 条件进行另外两次评估。

只是为了好玩,您还可以让 Nginx 根据您的 if 条件评估对图像、css 和 js 文件的请求。它们都不会匹配,因为您担心 pdf,但您仍然为请求处理添加了额外的 200% 开销。

一个对 Nginx 更友好的解决方案实际上非常简单。

Nginx 按照配置中列出的位置指令的顺序进行正则表达式匹配,并选择第一个匹配块,因此如果此文件 url 将匹配任何其他正则表达式指令,那么您需要将此块放置在这些位置之上:

location ~* /historical-rainfall-trends-south-africa-1921([^_])*?2015\.pdf$ {
    return 301 https://example.com/resources/weather-documents/historical-rainfall-trends-south-africa_1921_2015.pdf;
}

刚刚在我的一台运行 Nginx 1.15.1 的服务器上进行了测试,效果非常好。

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

Nginx 位置匹配特殊字符和编码 url 字符的正则表达式 的相关文章

  • 仅匹配空格或字符串开头/结尾之间的整数的正则表达式

    我目前正在使用该模式 b d b 用这些条目测试它 numb3r 2 3454 3 214 test 我只希望它捕获 2 和 3454 它非常适合捕获数字单词 除了边界标志 b 包括 作为一个单独的词考虑 我尝试排除句点 但在编写模式时遇到
  • 如何使用正则表达式解析 OCC 选项符号?

    OCC 选项符号由 4 部分组成 标的股票或 ETF 的根代码 用空格填充至 6 个字符 到期日期 6 位数字 格式为 yymmdd 期权类型 P 或 C 用于看跌或看涨期权 执行价格 为价格 x 1000 前面填充 0 至 8 位数字 举
  • 如何修复 Nginx 自动 301 重定向到带有尾部斜杠的相同 URL?

    当我尝试将 Web 应用程序的子目录中的索引文件访问到相同的 URL 但附加了斜杠 时 Nginx 出现了不良行为 它正在重新路由请求 我有一个简单的 Web 应用程序 其中设置了一个根目录和其中的许多子目录 每个子目录中都有一个 inde
  • Angular 2:使用正则表达式进行数字验证

    我正在尝试验证 IE 11 中的数字字段
  • Golang 正则表达式命名组和子匹配

    我正在尝试匹配正则表达式并获取匹配的捕获组名称 当正则表达式仅与字符串匹配一次时 这是有效的 但如果它与字符串匹配多次 SubexpNames不返回重复的名称 这是一个例子 package main import fmt regexp fu
  • Kate 文本编辑器正则表达式用于在 PC 上更改 CNC 代码

    使用某些CAM软件时 通常会正确生成带有空格的CNC代码 但例如 当通过 USB 或网络移动到 Citizen Cincom L20 机器并在那里进行编辑时 它会丢失空格 也会丢失分号 同时保留新行 无论如何 这些行都可以作为分号使用 但是
  • 正则表达式匹配带有连字符和/或撇号的单词

    我正在寻找一个正则表达式来匹配带有连字符和 或撇号的单词 到目前为止 我有 w w w 这在大多数情况下都有效 但如果先有一个撇号 然后有一个连字符 例如 qu est ce 则它不匹配 我可以附加更多选项 尽管也许还有另一种更有效的方法
  • 使用 Nginx 在 Docker 容器内部署带有路由器的 Angular2

    我正在尝试部署一个使用框架的路由器功能的 Angular 2 但在 docker 容器内使用 nginx 为其提供服务时遇到一些问题 由 angular cli 构建的 Angular 应用程序具有如下文件结构 dist 08c42df75
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 正则表达式将单词的开头和结尾与元音匹配

    我正在尝试以下操作Regex aeiou aeiou 但它不起作用 我测试了 abcda 并且不匹配 它应该只是 aeiou aeiou 额外的 您需要第二个字符是一个文字点 例如 a hello 但由于您的测试用例 abcda 不包含这样
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • php 或 zend 中国际电话号码验证的正则表达式是什么?

    我有一个 zend 表单 其中有一个电话号码字段 并且必须检查验证器 我决定为此使用正则表达式 我搜索了谷歌 但我得到的结果不起作用 谁能给我提供正则表达式 这是我的代码 phone new Zend Form Element Text p
  • 删除匹配前的一个单词和一个单词

    匹配之前的一个单词可以是一组任何符号 例如 D E F 我有一个正则表达式 s w s XXX 输入示例 This is KKK M D D xXx PPP输出示例 This is KKK PPP 所以我需要删除 XXX 之前的 1 个单词
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • Slim 3 - 斜杠作为路由参数的一部分

    我需要使用可以包含斜杠 的参数来编写 URL 例如 经典的 hello username 路线 默认情况下 hello Fabien将匹配此路线 但不匹配 hello Fabien Kris 我想问你如何在 Slim 3 框架中做到这一点
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • 从正则表达式对象中提取允许字符串的最大长度

    一旦加载到 C 中 是否可以从正则表达式模式中提取允许的字符串的最大长度Regex object 如果我有一个正则表达式字符串定义为 A Z0 9 0 20 我可以使用字符串操作来获取最大允许长度20 但是 有没有一种方法可以更轻松地实现这
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • 连接被拒绝:当uwsgi和nginx在不同容器中时

    我正在尝试设置两个 docker 容器 是的 无需 docker compose 分开 一个带有 nginx 另一个带有带有基本 Flask 应用程序的 uwsgi 我在 docker 内的同一网络中运行容器我的 nginx 配置已添加 链

随机推荐

  • C# 刷新 StreamWriter 和 MemoryStream

    我使用以下代码片段 我不确定是否需要调用Flush方法 一旦StreamWriter 一旦开启MemoryStream converts an xsd object to the corresponding xml string using
  • 如何在 Perl 中运行子命令正确导入环境?

    在从子命令导入环境时 我想将从 bash 脚本导出的所有环境变量添加到哈希中 什么时候program运行后 它将设置一些变量并导出它们 我想将这些变量保存在 Perl 脚本中供以后使用 但是我不想采用子命令中定义的 bash 函数 目前 我
  • 如何从 Java 获取 JanusGraphManagement

    我无法理解如何从使用ConfiguredGraphFactory 创建的图表中获取JanusGraphManagement 实例 我尝试做这样的事情 JanusGraphFactory Builder config JanusGraphFa
  • 更新 Popup.Animated 以播放 gif 直到外部任务完成 (PYSimpleGUI)

    我希望创建一个 UI 在执行另一项任务时显示动画弹出窗口 完成后将退出 我正在使用 PYSimpleGUI 并使用列出的示例here https github com PySimpleGUI PySimpleGUI blob master
  • 自定义注释不适用于 spring Bean

    我创建了新的自定义注释 MyCustomAnnotation Target ElementType METHOD ElementType TYPE ElementType FIELD Retention RUNTIME public int
  • com4j 与 jacob 从 Java 调用 COM 方法

    我维护一个遗留的 Java 应用程序 它使用Jacob http danadler com jacob 或Java COM Bridge 通过MS VBA和MS Word的COM接口进行调用 我一直在看com4j https com4j d
  • 实体框架中内容的国际化

    我不断遇到 i18n 要求 其中我的数据 而不是 UI 需要国际化 public class FooEntity public long Id get set public string Code get set Some values m
  • Groupby、移位和前向填充

    我有这个 df ID Date Time Lat Lon A 07 16 2019 08 00 29 39291 98 50925 A 07 16 2019 09 00 29 39923 98 51256 A 07 16 2019 10 0
  • 为应用程序操作创建自定义内置意图

    有一个可用的内置意图列表 可以在应用程序操作中使用谷歌开发者网站 https developers google com actions reference built in intents 我们有什么方法可以创建自定义的内置意图吗 不可以
  • Django Restframework、Django 通道、Ionic 2 - websocket 握手错误

    我目前正在开发一个使用线程标题中提到的技术的项目 我从浏览器中运行了这一切 该应用程序托管在 heroku 上 但是当我尝试从 Ionic 2 应用程序连接到 websockets 时 我总是在建立握手时遇到错误 2016 09 17T15
  • Excel 2007 及更高版本之间的 Range.Interior.Color 不同

    我发现 Range Interior Color 在某些情况下会为相同颜色返回不同的数字 具体取决于它是否在 Excel 2007 Excel 2010 或 2013 中运行 这是预期的吗 我很惊讶 Range Interior Color
  • Nginx 从旧 URL 重定向到新 URL

    我们正在更换房产搜索供应商 每个供应商的 URL 格式都略有不同 我们已经对 40 000 多个 URL 建立了索引 并希望将用户 301 重定向到新 URL URL 中的唯一区别是从下划线切换为连字符 以及从 idx 切换为 proper
  • 更新 Vector 中对象的属性

    我有一个包含对象的向量 这些对象有一个称为名字的属性 我想更新属性中的名字 为了做到这一点 我必须传递保存对象的向量 唯一标识每个对象的员工编号 最后是从用户输入中获取的新名称 我的问题是它在循环中显示更新名称 我用它来设置新名称 但如果我
  • Android:FastScrolling SectionIndexer getSections() 仅被调用一次

    我创建了一个ListView正在使用FastScroll 见图 当用户单击以下任何按钮 即所有曲目 艺术家 专辑 时 每次都会调用以下自定义 ArrayAdapter ArrayAdapter
  • Yii2:Ajax调用多个参数

    我使用此代码通过 ajax 调用自动填充 没有任何问题 我的视图文件中的代码 this gt registerJs dailywardentry doctor visit name on change function ajax url y
  • 我们可以使用函数作为 useEffect 中的第二个参数吗

    我有以下功能 function handleEnterPress e if e keyCode 13 if value let toAdd true chips forEach chip gt if chip value value toA
  • scrapy 项目在存储到 couchdb 时不可 JSON 序列化

    items py classes import scrapy from scrapy item import Item Field import json class Attributes scrapy Item description F
  • 如何在 WSL + VS Code 和 Docker 容器之间设置文件所有权?

    我的问题是我不知道 也不理解 如何最好地配置主机和容器之间的文件所有权 我是一名前端开发人员 所以这超出了我的深度 主机 运行 WSL2 的 Windows 10 Ubuntu 20 04 LTS 使用 VS Code WSL 远程扩展 容
  • 在R中的for循环中迭代子目录

    我有一个包含 365 个子目录的大目录 其中包含一年中每一天的图像 我创建了一个函数 我想将其应用于这些子目录中的每个图像 目前 这就是我所拥有的 library raster library zebu List all of the 36
  • Nginx 位置匹配特殊字符和编码 url 字符的正则表达式

    今天我已经尝试了很多事情 但我只是没有获胜 我的网站中有一个文件是偶然创建的 其中包含一个特殊字符 结果 Googlebot 已停止抓取 3 周 网站站长工具 搜索控制台不断通知我并希望重新测试网址 我想要实现的就是配置 Nginx 以匹配