url的最大长度257个字符是否可以用于mod_rewrite?


12

我的网址方案是/foo/var1-var2-var3.../bar

我正在使用这些mod_rewrite规则:

RewriteBase /foo/
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^ index.php [PT,L]

如果字符串'var1-var2 ...'的长度大于257个字符,则返回错误403 Forbidden和404。但是,如果'var1-var2 ...'字符串的长度为257个字符或更少,并且后接斜杠,则剩余网址的长度可以为任意长度。如何克服这一限制?

Answers:


12

您正在遇到基础文件系统的限制。

看一下文件系统限制。您会看到大多数文件名的最大长度为255个字节。因此,当apache和/或您的重写规则检查文件是否存在时,操作系统会将错误返回给apache。

使用Apache,如果将这样的规则放在.htaccess文件中,则解决该问题为时已晚。Apache将已经尝试统计长文件名,从而抛出文件系统错误“(36)文件名太长”,并返回403错误。

我看到两个选择:

  1. 在每个斜杠之间将应用程序的URL格式更改为最多255个字符。
  2. 将重写规则移动到apache虚拟主机配置中,然后删除REQUEST_FILENAME。

如果.htaccess文件不包含{REQUEST_FILENAME},但仍返回403,这可能仍然是问题吗?(serverfault.com/questions/140852/...
philfreo

1
您必须将重写规则移至apache config中。这是保留功能并解决问题的唯一方法。
h0tw1r3 2011年

3
当从移动的.htaccess规则Apache虚拟主机配置,您需要更改%{REQUEST_FILENAME}=> %{DOCUMENT_ROOT}%{REQUEST_FILENAME}并添加斜线到你的URL模式开始,如不RewriteRule ^abc ...但是RewriteRule ^/abc ...。您一定喜欢mod_rewrite的直接性……
ash108

2
“将重写规则移动到apache虚拟主机配置中”部分是黄金:正确实施后,它实际上可以工作,这与我尝试过的许多其他解决方法不同。
ash108
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.