第一个问题。因此,我在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”。
我玩了几天,总是得到以下结果之一:
我不知道发生了什么。我什至无法正确打破它。例如,我希望这个.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?
谢谢。
答案 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.html
或site1
在浏览器中都将是site1
。
这样,您将在重定向之前确保文件accepet .html
的扩展名,并且可以分开与错误文件混合的阶段。