2010-06-02 125 views
1

我在ManagedFusion設置文件(類似於.htaccess)中使用mod_rewrite,並且我想將所有傳入請求轉發到服務器上的另一個端口,除了幾個文件夾。使用.htaccess和mod_rewrite重定向目錄幾個例外

到目前爲止,我有這個(與文件夾的用戶界面,形式,clientsystem和被忽略的小部件)

RewriteEngine On 

RewriteCond %{REQUEST_URI} !ui$ 
RewriteCond %{REQUEST_URI} !forms$ 
RewriteCond %{REQUEST_URI} !clientsystem$ 
RewriteCond %{REQUEST_URI} !widgets$ 
RewriteRule ^/(.*) http://localhost:8050/$1 [P,L] 

這種精細的工作,只要這些例外目錄不存在,創建然而,當他們, rewriteengine只會再次觸發,在這種情況下,它會匹配規則,因此最終轉發給另一個端口。

我該如何解決這個問題?

另一個問題,如果我想要像'?file = bla'這樣的查詢也被轉發,這是否會像這樣工作?

編輯:這是我結束了:

RewriteCond %{QUERY_STRING} ^(.+)$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond $1 !^ui 
RewriteCond $1 !^forms 
RewriteCond $1 !^clientsystem 
RewriteCond $1 !^widgets 
RewriteRule ^/?(.*) http://localhost:8050/$1?%1 [P,L,R] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond $1 !^ui 
RewriteCond $1 !^forms 
RewriteCond $1 !^clientsystem 
RewriteCond $1 !^widgets 
RewriteRule ^/?(.*) http://localhost:8050/$1 [P,R] 

有些冗餘,但它的作品。

+1

關於rewriterule中的regexp備註:我認爲你不需要首先/之後^。如果你想確定,追加?之後/所以它總是匹配,有或沒有/作爲第一個字符。 – 2010-06-02 12:29:50

回答

1

至於你的問題的第二部分,使RewriteRule標誌如下所示:[P,L,QSA]。 QSA代表查詢字符串追加,並且在發生重定向之前會對您的最終字符串做出明顯的改動。

順便說一句,你很可能想在標誌中包含R,因爲它會真正將客戶端重定向到新的URL。

更新:所以現在我明白你想在任何情況下跳過這些目錄?

如果這是這樣,那麼你可以使用

RewriteCond $1 !^ui 
RewriteCond $1 !^forms 
... 
RewriteRule ^/(.*) http://localhost:8050/$1 [P,L,QSA] 

這將根本不匹配,如果請求的URL不能轉發用戶與任何特定字符串的開始。

+0

謝謝,是的,你是對的我不想在任何情況下轉發。他的解決方案似乎也行得通,我也會嘗試你的。 – 2010-06-02 12:29:25

+0

我試過QSA旗,但我不確定它是否有效。有沒有一種方法可以輕鬆測試?我去了http:// localhost:8040/test /?tempquery,並且在日誌文件中使用RewriteLog「rewrite.log」和RewriteLogLevel 9開啓了日誌記錄:2010-06-02T14:41:58 [Rewrite]代理服務器:http:// localhost:8050/test/ 這是預期的嗎? – 2010-06-02 12:54:33

+0

你應該看到你的完整的URL,以及在你的日誌中的查詢字符串部分,如127.0.0.1 - [02/Jun/2010:15:13:58 +0200] [localhost/sid#.../initial ](1)[perdir C:/ www/root /]重定向到http://localhost/index.php?asdf [REDIRECT/302]。老實說,我不知道mod_rewrite如何處理內部重定向到另一個主機。所以,根據我的經驗,我會在那裏使用R,QSA標誌,並且不會有任何問題。 – 2010-06-02 13:17:30

1

嘗試增加這僅適用規則,如果該名稱的文件或目錄不存在:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

順便說一句,我覺得這是mod_rewrite的小抄非常方便:http://dreev.es/modrewrite

相關問題