2016-05-09 26 views
1

我目前被mod_rewrite卡住了無限循環問題。Apache mod_rewrite - 基於%{HTTP_HOST}重寫爲文件夾名稱 - 無限循環

我想要的(規則,以便適用):使該文件夾名爲%中的文件{HTTP_HOST}(如果存在的話)用於

  • stript WWW(重定向)
  • 重寫請求
  • 如果該文件夾不存在,則重定向到使用domain.tld

實例:

  • www.subdomain.domain.tld =>重定向到subdomain.domain.tld
  • subdomain.domain.tld =>名爲subdomain.domain.tld文件夾內的文件的負載(和傳遞請求的其餘部分)
  • 未知subdomain.domain.tld =>重定向到使用domain.tld

我得到了什麼至今:

RewriteEngine On 

# Store protocol (HTTP or HTTPS) as ENV variable 
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' [OR] 
RewriteCond %{HTTPS} !=on 
RewriteRule ^(.*)$ - [env=proto:http] 
RewriteCond %{HTTP:CF-Visitor} '"scheme":"https"' [OR] 
RewriteCond %{HTTPS} =on 
RewriteRule ^(.*)$ - [env=proto:https] 

# Stript www 
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
RewriteRule^%{ENV:proto}://%1%{REQUEST_URI} [L,NC,QSA,R=301] 

# Directory exists => rewrite 
RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST} [NC] 
RewriteCond %{HTTP_HOST} -d 
RewriteRule^%{HTTP_HOST}%{REQUEST_URI} [L,NC,QSA] 

# Directory doesn't exist => redirect 
RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST} [NC] 
RewriteCond %{HTTP_HOST} !-d 
RewriteRule^%{ENV:proto}://domain.tld%{REQUEST_URI} [L,NC,QSA,R] 

我知道這一切都可以用虛擬主機來實現。不幸的是,我已經在一個共享的虛擬主機上了,我只能使用.htaccess,所以我有點不得不這樣做。

我很感謝任何幫助或想法讓我走向正確的方向。

+0

你在哪裏找的目錄?另外,如果您的所有子域都支持HTTPS,請始終將用戶重定向到SSL連接。 – hjpotter92

+0

這些目錄與.htaccess位於同一文件夾中。協議的保存更像是一種噱頭,因爲它在開發環境中不受支持。如果可能的話,你總是使用HTTPS是絕對正確的,最終版本中就是這種情況。 –

+0

什麼是apache版本? –

回答

1

希望這有助於:

RewriteEngine On 
RewriteBase "/" 

RewriteCond %{HTTPS} !=on 
RewriteRule ^(.*)$ - [env=proto:http] 
RewriteCond %{HTTPS} =on 
RewriteRule ^(.*)$ - [env=proto:https] 

# Strip www 
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
RewriteRule^%{ENV:proto}://%1%{REQUEST_URI} [L,NC,QSA,R=301] 

#Prevent loop 
RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule^- [L] 

# Directory exists => rewrite 
RewriteCond %{DOCUMENT_ROOT}/%{HTTP_HOST} -d 
RewriteRule^/%{HTTP_HOST}%{REQUEST_URI} [L,NC,QSA] 

# Directory doesn't exist => redirect (but not if host=example.com) 
RewriteCond %{DOCUMENT_ROOT}/%{HTTP_HOST} !-d 
RewriteCond %{HTTP_HOST} !=example.com 
RewriteRule^%{ENV:proto}://example.com%{REQUEST_URI} [L,NC,QSA,R] 
+0

這就像一個魅力!非常感謝你! :) –