在.htaccess文件中:
# Enable mod_rewrite
RewriteEngine on
# Rewrite file name
RewriteRule ^dome.htm$ dome.php [L,QSA]
# Force www
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Force SSL
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
强制SSL和WWW工作正常,除了重写文件名,其中请求从下面的URL返回到https://www.example.com/dome.php
的真实文件名:
example.com/dome.htm
www.example.com/dome.htm
https://example.com/home.htm
访问上面的URL时如何保持https://www.example.com/dome.htm
。
您需要更改处理顺序:
# Enable mod_rewrite
RewriteEngine on
# Force www
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Force SSL
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
# Rewrite file name
RewriteRule ^dome\.htm$ dome.php [L,QSA]
另请注意RewriteRule
中略微修改的正则表达式;-)
为什么这会有所不同?想象一下传入的请求被重写...根据您的规则顺序,请求首先被重写为/dome.php
,然后重定向到https://%{HTTP_HOST}%{REQUEST_URI}
,这将指示浏览器从该新URL加载/dome.php
... RewriteRules从上到下处理。当然,你指定了[L]
标志,然而这只会结束重写_的迭代!如果最后一次迭代改变了请求(执行了重写),则http服务器完成另一次迭代。
另一种方法是保留你的规则顺序,但使用[END]
标志代替[L]
,它可以做你想要的。但它只支持更新版本的apache http服务器,从版本2.4开始。
简单:
RewriteRule ^dome.htm?$ dome.php [NC,L] # Handle requests for "dome"