带有尾部斜杠的奇怪 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 行为 的相关文章

  • WebSockets 监听 UNIX 域套接字?

    是否可以在 nginx 服务器后面设置一个 WebSockets 服务器来处理 UNIX 域套接字上的连接 我目前在同一台计算机上有多个 WebSocket 服务器实例 并且存在端口共享问题 所有实例都必须分配一个唯一的端口 我想避免这种情
  • 找不到 NGINX brew 安装命令

    I do brew install nginx and get gt Downloading http nginx org download nginx 1 2 2 tar gz Already downloaded Library Cac
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • 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
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访
  • 在 IIS URL 重写模块中自定义 HTTP 标头

    我被一个简单的出站规则困住了 我想修改HTTP内容类型 to 应用程序 原子 xml 如果 URL 完全匹配http wayneye com Feeds Atom http wayneye com Feeds Atom 我的规则 XML
  • 管理面板的 htaccess 重写规则

    我的网络应用程序中有这样的 url 模式 www mysitename com foldername controller method 所有请求的页面首先被重定向到根文件夹上的index php 然后处理请求的页面 但每当我进入管理面板
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • Nginx url 限制 502 网关

    我有一个问题 但我接受绕过此功能的其他建议 基本上 我在 get 请求中向我的服务器发送大约 3000 个字符的大行文本 然后服务器将其作为 url 中的参数发送到谷歌翻译 问题 当 url gt 1900 个字符时 Nginx 会抛出 5
  • 使用 IIS 7.5 的特定页面的 HTTPS URL 重写规则

    我正在尝试在 IIS 7 5 中进行 URL 重写 以重定向到 HTTPS 以获得 单页 域的其余部分应保留 HTTP 为此 我正在编辑 Web config 文件 有人可以告诉我我在做什么吗 以下规则错误
  • Apache 2.4 URL 重写:/server/?Server=ServerName 到 /server/ServerName [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我试图简单地将 URL 重写为 server ServerName from server Server ServerName所以这样
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • Flask 或 Pyramid 中的简单网络 UDP 监听

    我需要创建一个 Web 应用程序来显示通过定期传入 UDP 数据包提供的数据 该站点可能位于 Flask 可能是 Pyramid 中 部署在 Nginx 下 如何创建一个非常简单的后台任务 基本上只是 socket recv 来侦听任何传入
  • 错误:最终加载程序(./node_modules/awesome-typescript-loader/dist/entry.js)未返回缓冲区或字符串

    dockerhub构建dockerfile时出现此错误 错误 最终加载程序 node modules awesome typescript loader dist entry js 未返回缓冲区或字符串 我在网上搜索了各种解决方案 但没有找
  • Nginx 和 Flask-socketio Websockets:存在但没有消息传递?

    我在让 Nginx 与 Python Flask socketio 库 基于 gevent 很好地配合时遇到了一些麻烦 目前 由于我们正在积极开发 我正在尝试让 Nginx 充当代理 对于发送页面 我可以通过直接运行flask socket
  • nginx 代理到子目录中的远程 Node.js Express 应用程序

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

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • nginx 解析器——dns

    请原谅一个非常初学者的问题 我无法理解 nginx 的 解析器 参数及其工作原理 我已阅读文档 搜索教程和帖子 使用解析器 nginx 和 dns 等关键字 但我仍然不确定如何应用解析器 http nginx org en docs htt

随机推荐

  • 用于检查资源是否存在的 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