Mod-Rewrite
需要將所有非 www 重定向到 www 並將所有 https 重定向到子域
在編寫包含以下規則的複合重寫時遇到問題:
要求:
- 重定向所有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://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}