2009-03-02 48 views
5

没有结束,我想在使用国防部重写转换网页地址一样/目录/directory/index.html,在一个标准的LAMP托管情况。我所用的地址以斜线结尾。我无法找到处理地址的方法,这些地址不会以斜杠结束。RewriteEngine叙述在.htaccess赶上文件HTML

什么似乎像它应该工作是:

rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in/*/ 
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */ 

但第二行导致500服务器错误。如果我加一个字母X到第二行:

rewriterule ^(.*)/$ $1/index.html [L] 
rewriterule ^(.*x(?!html))$ $1/index.html [L] 

它开始工作,但仅适用于在X结束目录名。我曾尝试用许多不同的东西替换x。任何比真实字符更复杂的东西(如[^ x]或。+)都会导致500服务器错误。

而且,为了满足我自己的好奇心,有谁知道为什么添加一个真实的字母会导致服务器错误和完美运行规则之间的区别?

[接受的答案]由于甘博我能近似使用的RewriteCond的解决方案:

 
rewritecond %{REQUEST_URI} !\.[^/]+$ 
rewriterule (.+) $1/index.html [L] 

这工作,但过滤器不仅仅是html的 - 它可以阻止其他页面。不幸的是,

rewritecond %{REQUEST_URI} !\.html$ 

导致服务器错误:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.

我还是想知道为什么:

rewriterule ^(.*(?!html))$ $1/index.html [L] 

结果在一个循环。上半部分应该检查是否不是以.html结尾。自去年下半年以来增加的.html,好像在功能上等同:

 
while(substr($address,-4)!='html') $address.='html' 

很显然,我失去了一些东西。

+0

如果您可以命名服务器错误,它会更有帮助。 – Gumbo 2009-03-03 09:55:42

+0

你没看过我的编辑笔记吗?前瞻断言看起来错误的方向。 – Gumbo 2009-03-10 16:25:26

回答

6

使用RewriteCond指令来检查是否网址路径不以.html结束。但.*(仅限于$)后没有任何内容。因此,尝试看看,后面的断言,而不是:

RewriteRule ^.*$(?<!html) $0/index.html [L] 

但请注意,你可能需要Apache 2.2使用这些说法。

1

嗯,实际上使其工作,你可以只使用负回顾后,而不是一个前瞻:

RewriteRule ^(.*)(?<!html)$ $1/index.html [L] 

我不知道为什么随便加入“X”使得它的工作,我会编辑,如果我弄明白了。

+0

这个建议创建了与我原来的建议相同的500服务器错误 - 并且它只在我添加了一个随机字母之前(?。 – 2009-03-03 07:57:07

1

为什么添加x使它工作: 如果替换将与正则表达式匹配,则将重新应用RewriteRule。作为一个例子,这将导致一个错误:

RewriteRule ^(.*)$ $1.rb 

,因为它会与script.rb取代script。这与正则表达式匹配,所以它会一次又一次地用script.rb.rb取代script.rb ...

这暗示在错误日志:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. 

在你的榜样,你添加的index.html到最后。如果在正则表达式的末尾有x,那么它将不匹配您的替换,它以l结尾。您使用先行断言((?!…)

RewriteCond %{REQUEST_URI} !\.html$ 
RewriteRule ^(.*[^/])?/?$ $1/index.html [L] 

编辑:

+0

它不应该在andrew提供的样本中作为[L] – 2009-03-02 21:59:01

相关问题