Apache mod_rewrite正在删除斜杠,并且通常会忽略我的规则

时间:2014-07-14 21:41:28

标签: regex apache .htaccess mod-rewrite

我在我的智慧结束,Stack Overflowers。尝试做我认为是一个简单的重写规则,用tilde替换URL中的斜杠,然后在末尾添加一个“.html”。 所以我的.htaccess就是这样:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.+)/(.+)$ $1~$2 [N]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([^/]+)$ $1.html [L]

基本上我正在运行一个重复的规则来替换所有斜率的斜杠,然后我的最终规则添加了“.html” - 因为我们所有的web文件都需要在一个文件夹中(客户端请求 - 傻,我知道。)

我在这里测试了“第一部分/第二部分/第三部分”模式:http://martinmelin.se/rewrite-rule-tester/它只有在我切断初始斜线并删除重写条件时才有效(这没有任何意义b / c没有文件名我放在那里应该存在于该服务器上),但在我的本地服务器上并非如此。

它应该最终读取文件“part-one~part-two~part-three.html”但是当我查看本地计算机上的Apache错误日志时,我得到了这个:

  

文件不存在:/ path / to / website / part-one

所以它基本上排除了最后两个部分并且从不试图添加“.html” - 所以到底是怎么回事?请帮忙,mod_rewrite大师!!

1 个答案:

答案 0 :(得分:1)

它希望您删除前导/的原因是因为重写引擎在通过htaccess文件中的规则运行它们之前剥离了前缀(URI的前导斜杠)。如果您使用的是apache 1.3,或者规则是在服务器或vhost配置中的非每个目录的上下文中,那么您需要在规则模式中使用前导斜杠:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/(.+)$ /$1~$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^/]+)$ /$1.html [L]

此外,您可能不想要N标志,因为您希望重写在其当前迭代中立即停止。此外,在重写之前首先检查.html是否实际存在的条件将阻止500个内部服务器错误。