带有尾部斜杠的奇怪 Nginx 行为

2024-02-24

我有一个非常有趣的行为。我想避免在我的网站上的 URL 中出现尾随斜杠。我已经把rewrite ^/(.*)/$ /$1 permanent;规则进入我的服务器块,所以
https://example.com/something/,
https://example.com/something////
重定向到
https://example.com/something;
and
https://example.com/
重定向到
https://example.com

But https://example.com////被重定向到...https://enjoygifts.ru////(实际上不重定向,是200代码)。为什么?

这是我的服务器块:




    server {
        listen 443 ssl;
        ...
        ... ssl directives
        ...

        root        /var/www/mysite.com;
        index       index.php;
        server_name mysite.com;
        rewrite ^/(.*)/$ /$1 permanent;

        location / {
            rewrite ^/.*$ /index.php last;
        }

        location ~ ^/index.php {
            try_files    $uri =404;
            include      /etc/nginx/fastcgi.conf;
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ ^/storage/app/uploads/public { try_files $uri 404; }
        ...
        ... lot of similar location blocks
        ...
    }

  

https://example.com并不真正存在,根 URI 是/- 它在浏览器地址栏中的显示方式取决于浏览器 - 有些会自动显示单独的/而其他人则会移除一个单独的/.

所以你不能重定向自https://example.com/ to https://example.com- 它将被默默地解释为来自的重定向https://example.com/ to https://example.com/.

Nginx 使用一个规范化的URI http://nginx.org/en/docs/http/ngx_http_core_module.html#location评估时location and rewrite语句,并生成$uri多变的。连续多次出现/被折叠成一个/.

虽然正则表达式^/(.*)/$匹配 URI//,该语句永远不会看到它。因为 Nginx 已经将该 URI 标准化为/,与正则表达式不匹配。


如果根 URI 具有多个/s 是一个问题,应用正则表达式$request_uri变量,其中包含规范化之前的原始 URI,还包括查询字符串(如果有)。

例如:

if ($request_uri ~ "^/{2,}(\?|$)") { 
    return 301 /$is_args$args; 
}

这可以放置在您的location / {...}堵塞。看这个警告 https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/关于使用if.

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

带有尾部斜杠的奇怪 Nginx 行为 的相关文章

随机推荐

  • 用于检查资源是否存在的 REST 标准

    检查资源是否存在的 REST 方法是什么 假设您有一些名为 项目 的资源 据我轻描淡写 其中一种方式是 获取资源 GET rest projects 123 GET rest projects someCriteria GET rest p
  • Django 1.7:提供 pdf 文件(UnicodeDecodeError)

    我正在尝试使用 django 1 7 提供 PDF 文件 这基本上是 应该 工作的代码 如果我将 content type 更改为 文本 并用它下载 tex 文件 它当然可以工作 但是当我用二进制文件尝试 得到 UnicodeDecodeE
  • 在 Gherkin 中使用正确的语法

    查找有关 Gherkin 的文档似乎非常困难 所以我想知道是否有一种方法可以增强步骤定义以使测试人员能够使用正确的语法 有一个例子可以说明我的意思 Testing Then I see there is 1 item More testin
  • Rails 4 + Capistrano 3:部署:检查不起作用

    我可以成功通过 SSH 连接到我的服务器 然而 当我这样做时deploy check 它给了我这个 Nets Mac Pro mysite emai be cap staging deploy check INFO e67f845c Run
  • Git:通过标签从远程拉取

    我是 git 的初学者 通过创建一个本地存储库来进行拉取和推送 在本地计算机上测试了几个命令 我在 project 中设置了一个裸存储库 并从中克隆了两个用户 user1 和 user2 该项目当前具有文件 one txt two txt
  • 如何使用 AppleScript 按类别过滤 Outlook for Mac 日历事件

    我正在尝试在 OSX 上编写一个 Applescript 以根据事件类别 例如 日历事件 过滤 Outlook for Mac 2011 日历事件 查找标记为 会议 的所有活动 例如 我有一个名为 WWDC 的日历事件 可以通过以下脚本找到
  • 通过 SoapClient 连接到 eBay Trading API 会抛出“Web 服务 eBayAPI 未正确配置或未找到且已禁用”异常

    我正在尝试连接到 eBay 交易 API 并使用 PHP 的 SoapClient 类发出基本请求 但遇到了麻烦 我已经花了几个小时搜索和摆弄示例 但我无法让任何东西发挥作用 所以我编写了以下准系统代码 并试图让它工作 token toke
  • 如何创建适合移动设备的网站[基础设施]

    如果我想创建一个相对较小的网站的移动友好版本 最好有一个子域 该子域可以重定向到具有单独标记和样式的全新网址 或者最好在代码中检测用户代理并以编程方式更改到不同的移动友好样式表 或者他们是我忽略的更好的基于基础设施的解决方案 Thanks
  • 如何将 gltf 编码/压缩为 draco

    我想使用 draco 在三个 js 和 Reactjs 中以编程方式压缩 编码 gltf 文件 我不想使用任何命令行工具 我希望以编程方式完成 请给我建议一个解决方案 我尝试使用 gltf pipeline 但它在客户端不起作用 当我在re
  • ReactJs 地图在 IE10 中未定义

    我看到类似的问题并尝试了一切但没有帮助 我收到错误 map is undefined in ie10 和 ie11 在我的项目上进行此更改后 ie11 可以工作 但 ie10 不能 在我的 package json 中 browsersli
  • 独立加速发生器

    我需要开发一个独立的 Acceleo 生成器 但我不知道如何启动 我已经在 Acceleo 项目中完成了生成器 Acceleo 项目包含generate mtl 文件 Generate java 文件和Activator java 文件 我
  • Xamarin.Forms(可为空)DatePicker:缺少确定和取消事件的解决方法

    我正在使用可为空的DatePicker https developer xamarin com api type Xamarin Forms DatePicker 它是通过子类化来实现的DatePicker并使用自定义渲染器 public
  • 用户输入验证,强制字符串仅包含字母

    我试图在我的方法之一中创建一个用户输入验证系统 它在一定程度上工作正常 但是尽管有代码 它仍然允许整数作为有效输入 我不希望它成为这样 我怎么能更改此代码 仅允许字母 字符串 作为有效输入 我在这一点上感到困惑 我尝试了这个系统的整数 它工
  • jQuery 浏览器兼容性 (IE)

    由于我试图向您展示的源代码相当长且复杂 因此我只是提供一个指向我遇到问题的页面的链接 http www thesportinghub com lms make my picks http www thesportinghub com lms
  • 将一个元素绑定到两个源

    我目前有两个接受任何数字的文本框 我有一个文本块 它接受输入的两个数字并计算平均值 我想知道是否有一种方法可以将此文本块绑定到两个文本框并利用自定义转换器来计算平均值 我目前正在捕获两个文本框中的文本更改事件并以这种方式计算平均值 但我假设
  • 没有安装的配置文件与安装的 iOS 代码签名密钥匹配

    当我选择 iphone 设备并构建时 它显示 xamarin ios 的错误 错误 555 没有安装的配置文件与安装的 iOS 代码签名密钥匹配 请帮助解决这个问题 尝试以下步骤重新安装证书和配置文件 去苹果会员中心 http develo
  • 如何使用 Spring JPA 对 jsonb 列进行查询?

    我正在使用 Spring JPA 和 PostgreSQL 数据库 我有一个实体如下 Entity TypeDef name json binary typeClass com vladmihalcea hibernate type jso
  • 更改 Kivy 中按钮的背景颜色

    我是 Kivy 的新手 在指定按钮的背景颜色时遇到困难 这是我的简单例子 custombutton py from kivy app import App from kivy uix widget import Widget class M
  • 获取 .Net 中 CryptoStream 的长度

    我正在开发加密 解密文件的软件 我希望能够猜测加密后数据的长度 但我无法使用 CryptoStream Length 它会抛出 NotSupportedException 有什么办法可以猜出来吗 我正在使用 RijndaelManaged
  • 带有尾部斜杠的奇怪 Nginx 行为

    我有一个非常有趣的行为 我想避免在我的网站上的 URL 中出现尾随斜杠 我已经把rewrite 1 permanent 规则进入我的服务器块 所以 https example com something https example com