我想在标准的LAMP托管情况下使用mod重写将/ directory之类的网页地址转换为/directory/index.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服务器错误.
并且,为了满足我自己的好奇心,有谁知道为什么添加一个真实的字母会使服务器错误和功能完善的规则之间产生差异?
[接受的答案]感谢Gumbo,我能够使用rewritecond来近似解决方案:
rewritecond %{REQUEST_URI} !\.[^/]+$ rewriterule (.+) $1/index.html [L]
这可以,但过滤器不仅仅是.html - 它可以阻止其他页面.不幸,
rewritecond %{REQUEST_URI} !\.html$
导致服务器错误:
由于可能的配置错误,请求超出了10个内部重定向的限制.如有必要,使用'LimitInternalRecursion'增加限制.
我还是想知道原因:
rewriterule ^(.*(?!html))$ $1/index.html [L]
导致循环.上半年应该检查它是否不以html结束.由于下半部分添加 .html,它似乎功能相当于:
while(substr($address,-4)!='html') $address.='html'
显然我错过了一些东西.
使用RewriteCond
指令检查URL路径是否以以下结尾.html
:
RewriteCond %{REQUEST_URI} !\.html$ RewriteRule ^(.*[^/])?/?$ $1/index.html [L]
编辑 您正在使用前瞻断言((?!…)
).但是之后没有任何东西.*
(只有一个$
).因此,请尝试使用后视断言:
RewriteRule ^.*$(?但请注意,您可能需要Apache 2.2才能使用这些断言.