mod_rewrite 的 url 的最大长度为 257 个字符?

Dan*_*iel 12 mod-rewrite .htaccess

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

我正在使用这些 mod_rewrite 规则:

RewriteBase /foo/
RewriteEngine on

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

RewriteRule ^ index.php [PT,L]
Run Code Online (Sandbox Code Playgroud)

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

h0t*_*1r3 12

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

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

对于 Apache,如果您将这样的规则放在 .htaccess 文件中,那么解决该问题就为时已晚。Apache 将已经尝试统计长文件名,从而引发文件系统错误“(36) 文件名太长”,返回 403 错误。

我看到两个选项:

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

  • 将规则从 .htaccess 移动到 apache 虚拟主机配置时,您需要更改 `%{REQUEST_FILENAME}` => `%{DOCUMENT_ROOT}%{REQUEST_FILENAME}` 并在 URL 模式的开头添加斜杠,例如不是 `RewriteRule ^abc ...` 但`RewriteRule ^/abc ...`。你一定会喜欢 mod_rewrite 的直率... (3认同)
  • “将重写规则移到 apache 虚拟主机配置中”部分是黄金:它在正确实施时实际上可以工作,这与我尝试过的许多其他解决方法不同。 (2认同)