2016-10-25 49 views
0

有沒有一種更簡單的方式來獲取正則表達式中的域名,並在重寫中轉發而不是下面的例子?更簡單的做法或在apache2重寫?

現在我抓住「每一個」域,並對www.domain [A | B | C] .com進行重寫。 而且我還需要在每個域中都抓住「*。域名[A | B | C] .com」和「域名[A | B | C] .com」。

<VirtualHost *:80> 
     RewriteEngine On 

     #domainA.com 
     RewriteCond %{http_host} ^domainA\.com$ [OR,NC] 
     RewriteCond %{http_host} ^(.+)\.domainA\.com$ [NC] 
     RewriteRule ^\/?(.*)$ http://www.domainA.com/$1 [R=301,L] 

     #domainB.com 
     RewriteCond %{http_host} ^domainB\.com$ [OR,NC] 
     RewriteCond %{http_host} ^(.+)\.domainB\.com$ [NC] 
     RewriteRule ^\/?(.*)$ http://www.domainB.com/$1 [R=301,L] 

     #domainC.com 
     RewriteCond %{http_host} ^domainC\.com$ [OR,NC] 
     RewriteCond %{http_host} ^(.+)\.domainC\.com$ [NC] 
     RewriteRule ^\/?(.*)$ http://www.domainC.com/$1 [R=301,L] 

</VirtualHost> 

<VirtualHost *:80> 
     Servername servername.com 

     ServerAlias www.domainA.com www.domainB.com www.domainC.com 

     # Server config stuffz here 

</VirtualHost> 

如果這是模糊的,我會盡力解釋更多:)

-
問候福爾克

回答

0

你可以重寫3個規則之一:

RewriteCond %{HTTP_HOST} (?:.+\.)?(domain[ABC]\.com)$ [NC] 
    RewriteRule .* http://www.%1$0 [R=permanent,L] 
  • domainA.com或* .domainA.com可寫爲(?:.+\.)?domainA\.com
    • (.+\.)?使子域部分可選
    • 最終的子域部分不重複使用,所以我們可以使用非捕獲子模式((?: ...)
  • DOMAINA或域B或domainC = domain[ABC](如果真實的,它是foo,bar和doe,使用(?:foo|bar|doe)代替)
  • 我們可以將最後一個RewriteCond的捕獲重新捕獲到Rewritule。與RewriteRule(第一個參數)捕獲的區別在於它們的前綴是%而不是$。所以%1將對應於domainA.com或domainB.com或domainC.com
  • 我也改寫^\/?(.*)$ + $1.* + $0
    • 沒有必要逃避/,這不是一個元字符,並用阿帕奇regexpes沒有任何分隔符(不喜歡從PHP參看preg_ *)
    • $0是一個特殊的捕捉這需要整個模式相匹配的子字符串(路徑 - 它或部分目錄上下文中)

編輯:是的,我的不好,我忘了你不在目錄上下文中:在%1$0之間不需要斜槓,$0捕獲的子字符串已經包含URL路徑的前導斜槓。

+0

這只是美麗的,我搜索的例子是(?:foo | bar | doe)。 目前,我只是得到了www.//,但我會如果我能看到最新的錯誤,並更新評論/問題/答案。 – Falk

+0

我已經做了一些測試在 - > [鏈接](http:但是我無法得到預期的結果,使用RewriteCond%{HTTP_HOST}(?:。+ \。)(?:foo \ .com | bar \ .com | doe。\ com) $ [NC] RewriteRule。* http://www.%1/$0 [R = permanent,L] – Falk

+0

Humm,無法編輯註釋.. RewriteCond%{HTTP_HOST}(?:。+ \。)(?: foo \ .com | bar \ .com | doe。\ com)$ [NC] RewriteRule。* http://www.%1/$0 [R = permanent,L] – Falk

0

爲@julp解決方案回答了我的情況下結束這樣的:

<VirtualHost *:80> 
     RewriteEngine On 

     RewriteCond %{HTTP_HOST} (?:.+\.)?(foo\.com|bar\.com|doe\.com)$ [NC] 
     RewriteRule .* http://www.%1$0 [R=permanent,L] 

</VirtualHost> 

<VirtualHost *:80> 
     Servername servername.com 

     ServerAlias www.foo.com www.bar.com www.foobar.com 
     # Server config stuffz here 

</VirtualHost> 

我不得不這樣做唯一不同的是:

RewriteRule .* http://www.%1/$0 [R=permanent,L] 

改變,沒有結尾的斜線:

RewriteRule .* http://www.%1$0 [R=permanent,L] 

這裏有一些討論:https://serverfault.com/questions/24130/why-do-i-get-a-double-trailing-slash-depending-on-where-my-rewriterule-is-locate