Mod-Rewrite

需要將所有非 www 重定向到 www 並將所有 https 重定向到子域

  • April 26, 2012

在編寫包含以下規則的複合重寫時遇到問題:

要求:

例如

http://example.com/checkout/123 -> https://wwws.example.com/checkout/123http://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://wwws.example.com的 http 請求時,它會將其重定向到http://www.wwws.example.com

我將如何實現滿足我要求的重寫?

不要使用 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}

引用自:https://serverfault.com/questions/382729