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



第一个问题。因此,我在Apache上有一个简单的网站" weblot.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>

我希望浏览器显示" weblot.com/site1"而不是" weblity.com/site.com/site1.html"。

我已经玩了几天了,我总是得到其中一个结果:

  1. 重定向的无限环路。
  2. 内部服务器错误。
  3. 两个版本都可以使用(例如" weblot.com/site.html"one_answers" weblity.com/site1"),但.html留在地址栏中。

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

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*).html$ /$1 [R=302,QSA]

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

Apache如何知道将" weblity.com/site1"重定向到" weblot.com/site1.html",而没有适当的重写?我的理解是错误的,我必须从weblity.com/site1重定向到weblity.com/site.com/site1.html才能使它起作用?

预先感谢。

您规则的最后一行:

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

这意味着仅将任何file.html更改为file,您需要的是ACCPET 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扩展,这将与错误文件混合在一起。

最新更新