需要将所有非 www 重定向到 www 并将所有 https 重定向到子域

需要将所有非 www 重定向到 www 并将所有 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}

相关内容