参数长度 > 255 的重写 URL 不起作用

参数长度 > 255 的重写 URL 不起作用

我正在使用 mod_rewrite 来重写 URL,如下所示:

http://example.com/1,2,3,4/foo/

通过在.htaccess 中执行以下操作:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

一切运行正常,但当“1,2,3,4”变成长度超过 255 个字符的字符串时,Apache 将返回“403 Forbidden”。

直接访问没有问题foo.php?id=1,2,3,4,即使使用很长的 id 字符串,但这对我来说不是一个选择。

我是否应该调整一些 Apache 或其他设置?

更新:我打开了 RewriteLog,并将 RewriteLogLevel 设置为 9。使用较短的 ID 字符串,我的日志文件中会显示几行。但是当 ID 字符串大于 255 个字符时,没有什么已被记录(好像 mod_rewrite 甚至没有执行?)。

如果您发现这个问题有趣/有用,请点赞。

答案1

您是否认为您遇到了文件系统的限制?

文件名的最大长度可能是 255 字节,当 apache 或 mod_rewrite 规则检查文件是否存在时,操作系统会向 apache 返回错误。

如果您在 .htaccess 文件中设置了一些规则,那么解决这个问题就太晚了。Apache 已经尝试统计文件名并抛出文件系统错误“(36)文件名太长”,返回 403 错误。

也许您可以将应用程序内的 URL 模式更改为从斜线到斜线最多 255 个字符。

编辑:看这里详细解答了这个问题。我从那里借用了我的答案。

答案2

关于这个限制有一个类似的问题这里

您可能遇到了底层文件系统的限制

我不知道您是否在 .htaccess 配置中的某处使用 REQUEST_FILENAME,因此不知道提供的解决方案是否有效。

答案3

绝对是一个有趣的问题。您是否运行过 mod_security?如果是,尝试过不使用它吗?也许它只是不喜欢长路径名或带有未编码逗号的长路径名?^^

尽管直觉上感觉更像是对 URL 路径的限制,或者至少是路径中的各个部分,或者底层文件系统对路径的解释,正如 GmonC 所写。这也可以解释为什么查询字符串中较长部分的常规 URL 可以正常工作。

我认为旧版 ASP.NET 也曾将请求路径限制为~260 个字符左右。

答案4

您愿意更换 http 服务器吗?那么请考虑使用 nginx 而不是 apache。

并使用http://wiki.nginx.org/NginxHttpRewriteModule

相关内容