.htaccess删除扩展名

时间:2012-08-22 00:03:41

标签: html .htaccess

我的.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文件也在根文件夹中。

1 个答案:

答案 0 :(得分:1)

如果您尝试在内部重写它们,原始规则将导致循环。例如,如果您从URI /some/file.html

开始
  1. 浏览器请求/some/file.html
  2. RewriteRule ^(.*)\.html$ /$1 [L,R=301]匹配,浏览器重定向到/some/file
  3. 浏览器请求/some/file
  4. 内部重写为/some/file.html
  5. 重写引擎循环,第一个规则再次匹配,浏览器重定向到/some/file
  6. 从#3
  7. 重复

    因此,您需要匹配第一条规则的实际请求:

    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部分,那么您根本不需要第一条规则。