我正在使用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个字符的string时,Apache返回一个“403 Forbidden”。
直接访问foo.php?id=1,2,3,4是没有问题的,即使是很长的idstring,但是这不是我的select。
有一些Apache或其他设置我应该调整?
更新 :我用RewriteLogLevel 9打开RewriteLog。用一个简短的idstring,我在我的日志文件中有几行。 但是当idstring大于255个字符时, 没有任何logging(好像mod_rewrite甚至没有执行?)。
如果您发现这个问题有趣/有帮助,请注意它。
你认为你遇到了文件系统的限制吗?
可能是最大文件名长度是255个字节,当apache或mod_rewrite规则检查文件是否存在时,操作系统会将错误返回给apache。
如果你在你的.htaccess文件中添加一些规则,解决这个问题为时已晚。 Apache将已经试图统计文件名并抛出文件系统错误'(36)文件名太长',返回一个403错误。
也许你可以改变你的应用程序内的url模式。 从斜杠到斜线的最大值为255个字符。
编辑: 在这里寻找这个问题的详细答案。 我从那里借来的。
这里有一个类似的关于这个限制的问题 :
您可能会遇到底层文件系统的限制
我不知道你是否在你的.htaccessconfiguration中使用REQUEST_FILENAME,所以不知道提供的解决scheme是否能够正常工作。
绝对是一个有趣的问题。 你是否运行mod_security,如果是的话,尝试没有它? 也许它只是不喜欢长path名称或长path名称中包含未编码的逗号? ^^
虽然它本能地感觉更像是一个urlpath的限制,或者至less是它的个别部分,或者是GmonC写的基础文件系统解释。 这也将解释为什么在查询string中的长部分的常规url工作正常。
我认为旧的ASP.NET曾经有一个约260个字符的请求path限制,以及。
你愿意改变http服务器吗? 然后考虑nginx而不是apache。