Apache:url 中的 %25(400 错误请求)

标签 apache http mod-rewrite

我有一个包含以下内容的网址:

/somepath/morestuff/ohno%25foobar

出于某种原因,apache 正在报告 400 错误请求(它与 %25 有关)。我正在使用 mod_rewrite 重写路径以指向我的 codeigniter 实例,但它甚至没有到达 codeigniter,这只是默认的 apache 错误。

有什么想法吗?

最佳答案

我怀疑您正在使用 PATH_INFO 来处理您的 CodeIgniter 请求。因此,您的 .htaccess 文件包含一个类似于此的规则集:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php/$0 [L]

mod_rewrite 测试您的 URL 时,它们已经被解码为其自然字符格式,因此在这种情况下 %25 变成了 %。当您应用此规则时,反向引用实际上包含文字文本 somepath/morestuff/ohno%foobar,默认情况下重新编码。 Apache 不知道 % 在你到 /index.php/somepath/morestuff/ohno%foobar 的请求路径中做了什么,并且阻塞,给你那个错误。

如果您运行的是 Apache 2.2,mod_rewrite 为此目的添加了 B 标志,允许您自动转义重写到您的 URL 的反向引用。将它添加到您当前的标志列表应该可以解决这种情况下的问题:

RewriteRule ^.*$ index.php/$0 [B,L]

还有一个escape RewriteMap在以前的 Apache 版本的 mod_rewrite 中作为内部映射可用,但不幸的是,必须在服务器或虚拟服务器配置级别启用此映射,因此如果您在共享主机。它做同样的事情,但更刻意一些。

在您的服务器/虚拟服务器配置中:

RewriteMap escape int:escape

然后,无论您在哪里定义规则:

RewriteRule ^.*$ index.php/${escape:$0} [L]

请记住,CodeIgniter 不需要使用 PATH_INFO 来获取请求信息,如果您不使用 ,使用 REQUEST_URI 是完全可以接受的>mod_rewrite 进行任何其他转换(并且可以完全避免这种头痛)。我认为默认情况下 CodeIgniter 设置为从 AUTO 获取请求(假设我没有混淆我的框架),所以只要不使用路径信息重写对 URL 的请求就足够了那个改变。

关于Apache:url 中的 %25(400 错误请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3549747/

相关文章:

java - Eclipse 在服务器上调试/运行

apache - 将数据库文件放在 htdocs 中安全吗?

java - 如何从 Android 应用程序内部发送 Web 请求?

javascript - 具有 Access-Control-Allow-Origin : * 的服务器

apache - .htaccess 域从子文件夹打开然后 rewriterule

php - 在 Yii2 .htaccess 中将 http 重定向到 https

apache - DirectAdmin Apache - .htaccess 重写

apache - 如何让 apache 服务器访问已安装的文件夹?

http - 在端口 80 上运行联邦 RabbitMQ

apache - “%2”在 RewriteRule 上被删除