2015-12-20 61 views
1

我正面臨一個Apache配置問題,可以總結如下。使用RewriteRule尋找一個RewriteBase等效

  1. 在一個獨特的主持系統我有很多不同的考點,每一個在其自己的子目錄,所以他們通過像myhostname.fr/sitename的URL訪問。
    因此在相應的.htaccess,通常的做法是有 + RewriteRule集之前RewriteBase /sitename,它工作正常。
  2. 現在對於其中一個網站(比如在specialsite子目錄中),我必須創建一個專用域,以便url看起來像domainname.myhostname.fr
    然後,對於本網站的工作,.htaccess現在需要RewriteBase /,而不是RewriteBase /specialsite,它也能正常工作。
  3. 這裏的訣竅是:對Apache不太熟悉我決定嘗試並想保持允許通過常見的URL myhostname.fr/specialsite訪問此網站。

因此,我必須找到一種方法來有條件地使用上述RewriteBase之一,具體取決於當前的url。

我嘗試的第一個方法是這樣工作的:

<If "%(HTTP_HOST) =~ domainname\.myhostname\.fr"> 
    RewriteBase/
</If> 
<If "%(HTTP_HOST) =~ myhostname\.fr/specialsite"> 
    RewriteBase /specialsite 
</If> 

但我得到一個HTTP 500錯誤,我花費很多時間去了解該<If>僞指令例如Apache 2.4的,而我的託管只提供Apache 1.3!

左右(由於一些其他的SO答案)我鑫卡特以另一種方式,這是第一次做:

RewriteCond %{HTTP_HOST} domainname\.myhostname\.fr 
RewriteRule^- [E=VirtualRewriteBase:/] 

RewriteCond %{HTTP_HOST} myhostname\.fr/specialsite 
RewriteRule^- [E=VirtualRewriteBase:/specialsite/] 

然後在前面加上所有的進一步RewriteRule替代與給定VirtualRewriteBase,就像這樣:

RewriteRule^%{ENV:VirtualRewriteBase}index.php [L] 

但是,雖然它對域訪問版本正常工作,它給我一個子目錄訪問版本的HTTP 404錯誤。
因此,爲了在如何應用我更換觀看改變了上述規則:

RewriteRule^%{ENV:VirtualRewriteBase}index.php [R,L] 

而且我觀察到重定向的URL看起來像這樣:

http://myhostname.fr/kunden/homepages/7/d265580839/htdocs/specialsite/index.php 

其中kunden/homepages/7/d265580839/htdocs/是完整的文檔我的託管根。
您可以注意到文檔根目錄已經在原始網址的兩部分之間插入了
此外,結果是完全一樣的,無論我在我的VirtualRewriteBase

所以這裏是我的主要問題:爲什麼會發生這種情況?
此外,我顯然對可能的替代解決方案感興趣,以實現雙重訪問可用性。
但最重要的,我想了解...

回答

1

但是,儘管它工作正常域接入的版本,它給了我一個 HTTP 404錯誤子目錄訪問版本。

這是因爲你的第二個條件從來沒有匹配。的確,HTTP_HOST只包含... http主機!​​是REQUEST_URI的一部分(或者也可以直接在RewriteRule中匹配)。

此代碼應該工作(反正,我不知道是否會完全解決你的問題,但是這是第一步)

RewriteCond %{HTTP_HOST} ^domainname\.myhostname\.fr$ [NC] 
RewriteRule^- [E=VirtualRewriteBase:/] 

RewriteCond %{HTTP_HOST} ^myhostname\.fr$ [NC] 
RewriteCond %{REQUEST_URI} ^/specialsite(?:/|$) [NC] 
RewriteRule^- [E=VirtualRewriteBase:/specialsite/] 
+1

正如你所指出的,「_Indeed_,HTTP_HOST只包含.. 。http主機!「。但這只是問題:它並不適合我。在這種特殊情況下,我不清楚HTTP_HOST和REQUEST_URI之間的邊界在哪裏。所以現在變得清楚了......因此很簡單!我試過了,它工作正常。非常感謝你的幫助。 – cFreed

+0

不客氣! –