如何设置 Nginx URI 以修复重定向到指定位置中的空 URI

2024-04-26

问题:当使用包含“%”符号的无效 URL 访问我们的网站时,Nginx 会抛出 400 Bad Request 错误。

我们希望将请求重写为 (WordPress) 404 页面,而不是 Nginx 页面。

我已经尝试过以下方法:

location @400 {
    rewrite ^ /404 break;
}

error_page 400 =307 @400;

但是,这会在 Nginx 上生成 500 内部服务器错误。

Nginx 错误日志显示:“...在读取客户端请求行时重定向到指定位置“@400”时空 URI...,请求:“GET ”'。

这并不意外,因为原始 URL 无效。

所以我想我正在寻找的是为重写显式设置 URI。这个怎么做?或者有更好的方法吗?我对 Nginx 不太熟悉。


我有相同的目标(返回 444 而不是自定义错误消息)并遇到了相同的问题@named_location(对于某些奇怪的请求,特别是当 header 中没有设置 POST/GET/HEAD 方法时,Nginx 返回其默认的 500 错误页面,并报告错误日志:empty URI in redirect to named location "@named_location" while reading client request).

有人用 Nginx 开了票 https://trac.nginx.org/nginx/ticket/1756,这是响应:

[...]问题是您试图将早期请求处理阶段(当请求 URI 尚未解析时)出现的错误重定向到指定位置。命名位置旨在保留现有的请求 URI,将此类不完整的请求重定向到命名位置可能会导致代码其他部分出现严重问题。因此,尝试执行此类重定向会导致“重定向到指定位置时 URI 为空”错误。这反过来又会阻止使用您的自定义错误页面,因此会返回一个内部错误页面。 如果要处理早期请求处理阶段出现的错误(例如 400 错误请求),请考虑使用具有显式设置 URI 的错误页面。或者您可以避免尝试重定向此类错误,因为这通常是更安全的方法。 请注意,服务器是 nginx,这并不是信息泄露。无论如何,它可以通过多种方式报告,包括服务器响应标头。如果您出于某种原因想要隐藏 nginx 版本,可以通过 server_tokens 指令来实现。

所以我将错误自定义更改如下:

error_page 301 400 403 404 500 502 503 504 =444 /444.html;
location = /444.html {
        return 444;
}

# Instead of:
# error_page 301 400 403 404 500 502 503 504 =444 @named_location;
# location @named_locations {
#         return 444;
# }
# which gives the above-mentioned error and returns Nginx's default 500 error page.

这似乎已经解决了问题。

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

如何设置 Nginx URI 以修复重定向到指定位置中的空 URI 的相关文章

  • PHP cookie 和会员安全

    我创建了一个论坛 该论坛在登录时使用 PHP 会话来确定用户 ID 并使用 cookie 来进行日志登录 我想我有两个问题 这是最好 最安全的方法吗 可以使用javascript通过地址栏手动添加cookie 这是一个巨大的安全风险 有没有
  • 替换 woocommerce 面包屑中的主页链接

    我知道这是一个有点愚蠢的问题 但我像个傻瓜一样找不到正确的答案 目前这就是我的面包屑的样子 首页 男配音 德里克 道尔 我需要将主页链接名称更改为 Voice Overs 并将其链接到另一个页面 请任何帮助都会很棒 Thanks Wooco
  • 如何跟踪访客从哪里来到我的网站 php

    我想跟踪用户访问我的网站的网站 URL 他来自 i el Google GMail Facebook 等 I tried SERVER HTTP REFERER 但当用户从任何外部站点单击我的站点链接时 它不包含任何内容 但当我访问我的站点
  • 如何计算PHP中内置函数的总数? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 如何计算
  • vagrant + virtualbox 等待机器启动时超时

    抱歉 我对 vagrant 很陌生 我正在运行 vagrant 1 4 3 和 virtualbox 4 3 26 我的主机操作系统是 ubuntu 14 04 2 我是一名 php 开发人员 我正在努力让我的开发环境为几个项目做好准备 我
  • 是否可以仅在一张表上运行“symfonydoctrine build --all”任务?

    如果我运行以下任务 它会构建所有内容并清除数据库 php symfony doctrine build all 我希望此任务仅针对我放入 schema yml 的新表运行 是否可以 我认为你应该为此使用迁移 首先 您需要恢复初始状态 当模式
  • Monolog Logger 在每个日志消息的末尾输出空数组

    我的记录器对象在每行末尾输出空数组 例如 2017 08 17 12 26 02 import log INFO checkForDuplicates is processing 2017 08 17 12 26 04 import log
  • 如何使用xampp连接sql服务器和php?

    我正在尝试使用 Xampp 将我的 SQL 服务器与 PHP 连接 我已经在ext文件夹中上传了dll文件 但无法连接它 我的PHP版本是7 2 6 上传的dll文件是 php pdo sqlsrv 72 ts dll php sqlsrv
  • Codeigniter - 错误 - 没有要更新的数据

    我本来要更新数据库 但收到错误 没有要更新的数据 这是我的脚本 我创建了一个简单的切换来更新数据库 切换使用户处于活动状态 is active 1 或非活动状态 is active 0 我遇到的问题是 虽然对象从 1 更改为 0 或 0 更
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • 在yii2的视图中添加模型中没有的自定义字段

    我在 yii2 中保存表单时遇到问题 我创建了一个自定义字段 其名称与其他字段相同Myposts categoryLevel2 该字段不在模型中 它是一个条件字段 当我发布我的内容时 我将其值分配给模型属性 例如 categoryLevel
  • 如何在 PHP 中验证小数

    如何在 PHP 中验证十进制数字 我查看了 is numeric 但这对我不起作用 bool is numeric 混合变量 查找给定变量是否为 数字 数字字符串包括 可选符号 任意数量的数字 可选的小数部分和可选的 指数部分 因此 012
  • PHP 中的 ebXML\ebMS 实现

    中是否有任何示例 测试用例或定义PHP实施 ebXML 它被推广为 B2B 数据传输方式 但信息 讨论和工具却无处可寻 我是否找错了地方或者使用 PHP 来解决这个错误 None
  • 如何像mysql一样对数组进行排序

    如何对与数据库数据相同的数组进行排序 我请求谷歌分析数据 数据是一个大数组 我想将数组与本地数据库中的一些其他字段连接起来 然后我再次扩展大数组 现在我想对大数组进行排序 这与使用我的 sql 相同 如下所示 select from ga
  • 调用未定义的函数 mcrypt_decrypt() - 即使安装了 php5-mcrypt

    所以我无法停止收到错误 PHP Fatal error Call to undefined function mcrypt decrypt in 即使我安装了 php5 mcrypt 我也重新安装了 php 好几次 但我无法让它工作 更多信
  • 使用正则表达式在图像标签周围添加链接

    我想使用 preg replace 在图像标签周围添加链接 Before img href src alt After a href img href src alt a 我将非常感谢任何帮助 非常感谢 这有帮助吗 str img href
  • php 中是否可以使用正则表达式替换短语后面的单词?

    输入文本 工程学院 医学院 所需产出 教育学院 教育学院 规则 school of 后面的任何单词都需要替换为 education inputext school of engineering school of medicine rule
  • 使用 PHP 连接到 Amazon RDS

    我正在尝试将 RDS 实例与 PHP 连接文件连接 这是我的文件中的内容 define DB SERVER localhost define DB USERNAME User Name define DB PASSWORD Password
  • PHP 错误:php_network_getaddresses:getaddrinfo 失败:(从其他站点获取信息时。)

    尝试从外部源获取信息时 我收到以下错误 Warning php network getaddresses getaddrinfo 失败 第 行名称解析暂时失败 昨天一切都很好 那么这个脚本发生了什么 它不起作用并给我上面的错误 有什么解决方
  • 将一段文本保存到mysql

    我正在使用 php 和 mysql 做一个项目 我对此很陌生 现在我必须将一段文本存储到我的数据库中 在表中 对于列 I tried varchar 5000 创建表时但它不允许我 所以请给我一个解决方案 你的 mysql 字段类型应该 T

随机推荐