我的.htaccess文件遇到了一些麻烦,我放置了代码,删除了文件的扩展名,所以它看起来像这样:www.foo.com/x,它适用于我的所有页面。但是,当我使用我的导航栏时,它不起作用。我已经将每个页面上的URL更改为www.foo.com/x,所以我很困惑我的问题是什么。这是我的.htaccess文件中的代码:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301]
这是我的导航条代码:
<ul id="menu">
<li><a href="http://www.foo.com/" class="active">Home</a></li>
<li><a href="http://www.foo.com/projects">Projects</a></li>
<li><a href="http://www.foo.com/about">About</a></li>
<li><a href="http://www.foo.com/contact">Contact</a></li>
</ul>
我可以补充说www.foo.com/projects等工作正常并转到正确的页面,如果不明显,我的.htaccess文件也在根文件夹中。
答案 0 :(得分:1)
如果您尝试在内部重写它们,原始规则将导致循环。例如,如果您从URI /some/file.html
/some/file.html
RewriteRule ^(.*)\.html$ /$1 [L,R=301]
匹配,浏览器重定向到/some/file
/some/file
/some/file.html
/some/file
因此,您需要匹配第一条规则的实际请求:
RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.html
RewriteRule ^ /%1 [L,R=301]
这是重定向,如果你有链接仍然转到.html文件,现在你需要在内部将它们重写回html文件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ /$1.html [L]
如果您的所有链接都已删除.html部分,那么您根本不需要第一条规则。