相关疑难解决方法(0)

在.htaccess中重写引擎以捕获不以html结尾的文件

我想在标准的LAMP托管情况下使用mod重写将/ directory之类的网页地址转换为/directory/index.html.我对以斜线结尾的地址有效.我找不到一种方法来处理不结束斜杠的地址.

看起来它应该工作的是:

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

但第二行导致500服务器错误.如果我在第二行添加单个字母x:

rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]
Run Code Online (Sandbox Code Playgroud)

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

并且,为了满足我自己的好奇心,有谁知道为什么添加一个真实的字母会使服务器错误和功能完善的规则之间产生差异?

[接受的答案]感谢Gumbo,我能够使用rewritecond来近似解决方案:

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

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

rewritecond %{REQUEST_URI} !\.html$
Run Code Online (Sandbox Code Playgroud)

导致服务器错误:

由于可能的配置错误,请求超出了10个内部重定向的限制.如有必要,使用'LimitInternalRecursion'增加限制.

我还是想知道原因:

rewriterule ^(.*(?!html))$ $1/index.html [L]
Run Code Online (Sandbox Code Playgroud)

导致循环.上半年应该检查它是否以html结束.由于下半部分添加 .html,它似乎功能相当于:

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

显然我错过了一些东西.

html regex .htaccess mod-rewrite

5
推荐指数
1
解决办法
7030
查看次数

标签 统计

.htaccess ×1

html ×1

mod-rewrite ×1

regex ×1