我正在使用 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
答案3
绝对是一个有趣的问题。您是否运行过 mod_security?如果是,尝试过不使用它吗?也许它只是不喜欢长路径名或带有未编码逗号的长路径名?^^
尽管直觉上感觉更像是对 URL 路径的限制,或者至少是路径中的各个部分,或者底层文件系统对路径的解释,正如 GmonC 所写。这也可以解释为什么查询字符串中较长部分的常规 URL 可以正常工作。
我认为旧版 ASP.NET 也曾将请求路径限制为~260 个字符左右。
答案4
您愿意更换 http 服务器吗?那么请考虑使用 nginx 而不是 apache。