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


12

我正在使用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或其他设置?

更新:我使用RewriteLogLevel 9打开了RewriteLog。使用短ID字符串,我的日志文件中出现了几行。但是,当id字符串大于255个字符时,不会记录任何内容(似乎mod_rewrite甚至没有执行?)。

如果您觉得这个问题有趣/有帮助,请对其进行投票。


这可能是正则表达式问题吗?您是否检查过重写请求对于长度超过255个字符的字符串是正确的?如果没有,您也许可以发布重写前和重写后的请求。
tomjedrz

3
使用RewriteLog和启用mod_rewrite的日志记录,RewriteLogLevel因此您可以看到匹配的内容以及它实际上是如何被重写的。我想可能只有255个字符被复制到$1,最终导致id客户端无权看到该字符,因此Apache返回了403。我没有看代码,但是可能是Apache操纵的固定256字节缓冲区中的反向引用(第256个保留给终止NULL)。
James Sneeringer,2010年

见问题更新-没有被记录长期PARAMS
philfreo

Answers:


8

您是否认为文件系统受到限制?

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

如果您在.htaccess文件中添加了一些规则,则解决该问题为时已晚。Apache将已经尝试统计文件名并抛出文件系统错误“(36)文件名太长”,并返回403错误。

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

编辑:在这里寻找此问题的详细答案。我从那里借来的。


是的,这是目前我们所能做的,但我希望有一个解决方法或进行调整。
philfreo 2010年

3
Microspino,看来您是从@Jeff Clark的答案中剪切并粘贴了部分答案的地方:serverfault.com/questions/120397/…。您应该超链接至该答案,以使他声名狼藉。
Stefan Lasiewski 2010年

@Stefan lasieswski:对,我添加了参考。
microspino 2010年

因此,您正在考虑也许Apache试图统计请求的文件,无论如何-我的意思是,这可能是解释过长的URL甚至没有被重写引擎拾取的唯一方法...
HorusKol

是的,这是我的主意,尽管我认为通常出于多种原因应避免使用如此长的url和文件名。因此,我认为最好的建议可能是在文件名还不太长的情况下更改URL模式。
microspino'5

2

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

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

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


那是有道理的,但是不,我不是。我编辑了问题,将.htaccess文件全部包含在内。还有其他想法吗?
philfreo

据“阿帕奇mod_rewrite的技术细节”在httpd.apache.org/docs/trunk/rewrite/tech.html “虽然mod_rewrite的重写的URL到URL,URL到文件名和文件名,甚至以文件名,该API目前只提供一个URL到-filename钩。”。因此,即使您未找到实际文件,也可能是文件名挂钩的URL达到了操作系统资源限制?
Stefan Lasiewski,2010年

0

绝对是一个有趣的问题。您运行mod_security吗?如果没有,请尝试运行吗?也许它根本不喜欢长路径名或其中包含未编码逗号的长路径名?^^

尽管本能地感觉更像是对url路径的限制,或者至少是它的单个段,或者像GmonC所写的那样对其进行底层文件系统解释。这也可以解释为什么查询字符串中带有较长部分的常规url可以正常工作。

我认为较旧的ASP.NET过去的请求路径限制为260个字符左右。


参见更新问题。不,我在/usr/include/apache2/或中没有看到mod_security文件/usr/lib/apache2/modules/(但在那儿确实看到了mod_rewrite),所以我假设它没有安装。
philfreo 2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.