APACHE SSL WWW重定向到真实姓名

问题描述 投票:1回答:2

在.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

apache .htaccess url-rewriting url-rewrite-module
2个回答
1
投票

您需要更改处理顺序:

# 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开始。


0
投票

简单:

RewriteRule    ^dome.htm?$    dome.php [NC,L]    # Handle requests for "dome"
© www.soinside.com 2019 - 2024. All rights reserved.