在编写包含以下规则的复合重写时遇到问题:
要求:
- 全部重定向http://example.com->http://www.example.com
- 重定向所有 https://* ->http://wwws.*
- 强制所有 /checkout/* 页面使用 https:
例如
http://example.com/checkout/123->https://wwws.example.com/checkout/123 或者http://example.com/checkout->https://wwws.example.com/checkout/123
我目前所做的:
我目前有一系列的重写,将非 www 重写为 www:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
这是有问题的,因为当对 URI 进行 http 请求时:http://wwws.example.com它将重定向到http://www.wwws.example.com。
我该如何实现重写才能满足我的要求?
答案1
不要使用HTTP_HOST:
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
我倾向于这样:
RewriteCond %{HTTP_HOST} !^www.*$ [NC]
RewriteRule ^/.+www\/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
或者更简单:
<VirtualHost *:80>
ServerAlias example.com
RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
留给阅读的练习:找到更多其他方法。
要将 https 重定向到 http:
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*) http://%{SERVER_NAME}/$1 [L,R]
或者:
RewriteCond %{HTTP} off
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}