【发布时间】:2010-10-10 21:07:49
【问题描述】:
我想在标准 LAMP 托管情况下使用 mod rewrite in 将 /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 近似解决方案:
重写条件 %{REQUEST_URI} !\.[^/]+$ 重写 (.+) $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'显然我错过了什么。
【问题讨论】:
-
如果你能命名服务器错误会更有帮助。
-
您没有阅读我的编辑说明吗?前瞻断言看起来方向错误。
标签: html regex .htaccess mod-rewrite