mod_rewrite可从地址栏中删除.html,而无需更改html文件中的链接

时间:2019-03-09 16:58:45

标签: html apache .htaccess mod-rewrite

第一个问题。因此,我在Apache上有一个简单的网站“ website.com”:

website.com
    index.html
    site1.html
    site2.html

在每个html中,我都具有以下形式的链接:

<a href="index.html">main</a>
<a href="site1.html">site1</a>
<a href="site2.html">site2</a>

我希望浏览器显示“ website.com/site1”而不是“ website.com/site1.html”。

我玩了几天,总是得到以下结果之一:

  1. 无限循环重定向。
  2. 内部服务器错误。
  3. 两个版本都可以工作(例如“ website.com/site1.html”和“ website.com/site1”),但是.html保留在地址栏中。

我不知道发生了什么。我什至无法正确打破它。例如,我希望这个.htaccess会在访问“ website.com/site1”时引发错误,因为没有规则将site1重定向到site1.html:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)\.html$ /$1 [R=302,QSA]

但是没有-它可以工作,只是不删除地址栏中的.html。

Apache如何知道在没有适当的RewriteRule的情况下将“ website.com/site1”重定向到“ website.com/site1.html”?我的理解是错误的,为了使它正常工作,我必须从website.com/site1重定向到website.com/site1.html?

谢谢。

1 个答案:

答案 0 :(得分:0)

您的规则的最后一行:

RewriteRule ^(.*)\.html$ /$1 [R=302,QSA]

这意味着仅将任何file.html更改为file,而您需要的是让file像这样在内部将其重定向到file.html

RewriteRule ^(.*)$ /$1.html [L,QSA]

但是,在这种情况下,file.html将保持不变,如果您想完全删除.html,请尝试以下规则:

RewriteEngine on 
RewriteCond %{THE_REQUEST} \s/+(.*)\.html[\s?/] [NC]
RewriteRule ^  /%1 [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME}   !-f 
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ /$1.html [L]

RewriteEngine on之后的前两行将删除.html

其余行将检查请求扩展范围是否为.html文件,如果请求满足.html,它将在内部重定向。

现在,site1.htmlsite1在浏览器中都将是site1

这样,您将在重定向之前确保文件accepet .html的扩展名,并且可以分开与错误文件混合的阶段。