2013-07-05 88 views
0

我有一個的httpd的虛擬主機重寫規則配置到任意端口80的流量轉發到端口443網址:阿帕奇重寫條件的援助

RewriteEngine on 
RewriteCond %{SERVER_PORT} !^443$ 
RewriteRule ^(.*)$ https://www.example.com/dir/subdir$1 [L,R] 

當最終用戶導航到端口80首先這工作得很好。但導航到端口443的最終用戶不會處理重寫規則,因爲它不在httpd-ssl配置文件中。

什麼是正確的方式來包含httpd-ssl重寫條件,以便如果URL尚未被重寫,我可以重寫它?

我已經試過各種選項,最後的httpd-ssl的重寫嘗試如下:

RewriteCond %{DOCUMENT_ROOT} !^/dir/subdir$ 
RewriteRule ^/(.*) /dir/subdir$1 
+0

你的最終目標是什麼?看起來你正試圖將所有請求寫入'dir/subdir'。請提供您的最終用戶將看到的示例網址,以及應該重寫/重定向到SSL和非SSL的示例網址。 –

+0

最終目標是任何最終用戶轉到www.example.com或example.com,無論HTTP或HTTPS將被重定向到https://www.example.com/dir/subdir在端口443 –

回答

0

需要重定向到SSL會要求你有兩個重寫規則,因此可能兩個重定向遊客。你不能輕易地強制SSL並按照一條規則執行重定向。

建議使用%{HTTPS}而不是檢查端口,因爲它允許您在需要時使用替代端口,如80或8443。

RewriteEngine On 

# First force SSL: 
RewriteCond %{HTTPS} !on 
RewriteRule (.*) https://%{HTTP_HOST}/$1 [L,R=301] 

# Then redirect all requests not already in dir/subdir into that path 
RewriteCond %{REQUEST_URI} !^/dir/subdir 
RewriteRule (.*) https://%{HTTP_HOST}/dir/subdir/$1 [L,R=301] 

如果需要所有用戶強加給www.example.com,在上述兩種RewriteRulewww.example.com更換%{HTTP_HOST}。使用%{HTTP_HOST}將允許該域留在用戶請求的任何地方,例如, example.com而不是www.example.com

+0

嗨Michael,非常感謝您的意見。在閱讀您的最新回覆之前,我設法完成了我的目標。我已經在原始中使用!^ 443上的%{HTTPS}參數中使用的建議。我在httpd-vhosts.conf文件中配置了強制ssl配置。在httpd-ssl.conf中,我使用了一個RedirectMatch ^/$ https://www.example.com/dir/subdir/$1,這似乎已經成功了。我實施的方法是否比上面建議的方法遜色? –

+0

@ Pete.Jibe不亞於,只是不同而已。大多數來這裏使用Stack Overflow處理Apache問題的人都無法訪問apache .conf文件,因此我傾向於使用htaccess就緒解決方案進行回覆。我自己,我傾向於發現RedirectMatch比RewriteRule更不明顯,特別是如果它必須與其他重寫規則混合使用,但兩種方法都是有效的。但是,如果您必須稍後更改或添加例外,則RewriteRule可以更靈活。 –