2016-10-03 26 views
0

我對服務器沒有多少經驗。所以,這可能是一個愚蠢的問題。目前在我的Apache服務器vim /etc/apache2/sites-enabled/000-default.conf文件中,我有一個proxypass如下。Apache有條件代理通行證

ProxyPass  /phpmyadmin ! 
    ProxyPass/http://localhost:8080/ 
    ProxyPassReverse/http://localhost:8080/ 

我想實現一個有條件的代理通行證下面的情形

如果URL中包含?_escaped_fragment_=,像下面

http://localhost/web/?_escaped_fragment_=/health 

的URL我希望這個網址被重定向到一個URL一個不同的端口,如下面的URL,

http://localhost:8082/web/?_escaped_fragment_=/health 

如果URL不是包含?_escaped_fragment_=,像下面的網址,

http://localhost/web/#!/health 

代理通過我前面提到的,其重定向到8080端口應該發生。這是什麼代碼?

+1

什麼是Apache的版本? –

+0

尋找[apache條件代理通行證](https://www.google.de/search?q=apache+conditional+proxypass)給其他人http://serverfault.com/questions/625426/how-to-create-條件代理通行證,也許這有助於。 –

+0

嗨,我的Apache版本是Apache/2.4.7 –

回答

0

由於ProxyPass無法進入If語句,您將需要使用mod_rewrite代理/重定向並使用RewriteCond過濾查詢字符串。

因爲,因爲它是請求的查詢字符串不改變,這裏是一個粗略的例子:

RewriteEngine on 
RewriteCond %{QUERY_STRING} ^_escaped_fragment_ [NC] 
RewriteRule ^/(.*) http://localhost:8082/$1 [QSA,P,L] 
RewriteRule ^/(.*) http://localhost:8080/$1 [P,L] 
ProxyPassReverse/http://localhost:8080/ 
ProxyPassReverse/http://localhost:8082/ 

這意味着,如果QUERY_STRING字符串「_escaped_fragment_WHATEVERHERE」代理一切目的在端口8082相匹配,並附加任何查詢它被添加的字符串。

對於其他情況代理,它將代理到localhost:8080。

請注意,我添加了QSA,它是一個標誌,表示在原始請求中追加了任何查詢字符串,但爲了清晰起見,我添加了它,因爲在這種情況下,默認情況下mod_rewrite會執行此操作。有關它在重寫標誌鏈接中的更多信息,我添加下面的內容。

你可以讓這個例子更加具體,例如,如果你不希望你可以用更早的更詳細的rewritecond或者使用另一個rewritecond過濾它,那麼最後一次重寫將採用任何其他查詢字符串。

對於這裏更多的細節是什麼,官方文檔說一下吧: Rewrite Flags mod_rewrite

+0

我已經使用這個重寫規則的王。但我不能實現這一點,因爲那麼瀏覽器中的URL也會自動更改爲本地主機,這不適用於我的實現。我希望瀏覽器中的URL相同。不能使用IfDefine來檢查條件並定義端口號。我試過這樣做,它不工作。當我嘗試在內部定義一個變量時,它會給出一個錯誤。 –

+0

如果你在頁面返回時添加一個例子爲http:// localhost或類似的,那麼我可能會提供幫助。這些重寫不會影響url中的主機名,而且您描述的問題與它們無關,您可能只是缺少一個ProxyPassReverse條目,如添加:'ProxyPassReverse/http:// localhost:8080/'和'ProxyPassReverse/http:// localhost:8082 /'。讓我解決這個問題的答案。 –