如何更改mod_rewrite以避免{REQUEST_FILENAME}以获得255个字符的URL限制?

根据这个答案: mod_rewrite的最大URL长度为257个字符? 基于使用mod_rewrite的文件系统,最多有255个字符的硬限制。

根据接受的答案,有两个解决scheme:

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

我不能使用第一种方法,所以我想弄清楚第二种方法。

我已经按照要求将重写规则放入Apache虚拟主机configuration中。 不过,我不知道如何删除REQUEST_FILENAME,仍然有我的Web应用程序框架(蜻蜓)仍然工作。

以下是我从.htaccess移动到Apache的虚拟主机configuration文件中的部分重写规则:

RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-f [OR] # if don't want Dragonfly to process html files comment # out the line below (you may need to remove the [OR] above too). RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ # Main URL rewriting. RewriteRule (.*) index.cgi?$1 [L,QSA] 

我尝试删除{REQUEST_FILENAME},它只是以各种方式打破了框架。 如何在不使用{REQUEST_FILENAME}的情况下重写?

下面三行告诉Apache检查文件系统是否存在。

 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-f [OR] 

第一个意思是“如果URI不是目录”。 第二个意思是“如果URI不是一个链接”。 第三个意思是“如果URI不是文件”。

如果删除或注释掉这些行,Apache会将下面的重写应用于每个不以“.html”或“.nl”结尾的文件,也不会检查文件系统是否先存在该文件。

上面三行有一个目的。 他们在那里,所以如果你添加一个实际的文件,目录或者符号链接到你的文档根目录,并且有人请求这个文件,目录或者符号链接,Apache会像往常一样处理它,而不是重写。 如果你知道你永远不会将实际的文件添加到文档根目录下,那么你可以安全地评论这些文件,而没有任何副作用。


一个潜在的更好的变化是在这样的三条线上面添加一个新的规则:

 RewriteRule (.*[^/]{255}.*) index.cgi?$1 [L,QSA] 

这将截取斜线之间的单个string超过255个字符的任何URI,并直接将其发送到重写而不检查文件系统。 [L]选项确保Apache不检查任何更多的规则,如果它匹配这个。 没有拦截将映射到实际文件的URI的危险,因为匹配此正则expression式的URI将不是有效的文件path。

更新:

一个匹配任何长度至less为255个字符的URI的正则expression式。

 RewriteRule (.{255}) index.cgi?$1 [L,QSA] 

下面的代码适用于我(用Apache 2.2.21在debian上的默认虚拟主机上testing)。

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} (.{255}) [OR] RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ [OR] RewriteCond %{REQUEST_FILENAME} !-d [OR] RewriteCond %{REQUEST_FILENAME} !-l [OR] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) /index.cgi?$1 [L,QSA]