2017-09-04 106 views
5

我必須將80上的所有apache請求重定向到8080上的tomcat,除了一個路徑。Apache ProxyPass錯誤

所以,如果收到http://example.com/anything - > tomcat:8080。

但是,如果URL是:http://example.com/site - > apache應該服務,並且不需要重定向。

目前,在/var/www/html/內有一個名爲site的文件夾。

這是我目前的配置文件:

site.conf(這個文件只包含以下內容,是conf.d文件夾中)

<LocationMatch "/*"> 
     Allow from all 
     ProxyPass    /site ! 
     ProxyPass    http://127.0.0.1:8080 
     ProxyPassReverse  http://127.0.0.1:8080 
</LocationMatch> 

我覺得這是一個簡單的事情來完成與Apache,但我已經嘗試了一切,我可以找到,我仍然得到錯誤:

ProxyPass|ProxyPassMatch can not have a path when defined in a location. 

問題是根網站運行在tomcat上,但其他運行在apache上(我在這個問題中調用了站點)。

如果有人可以幫忙,我很感激。

謝謝!

更新1 - 2017年9月6日

我得到它,如果我刪除LocationMatch,把ProxyPass 直接在.conf文件工作:

ProxyPass    /site ! 
ProxyPassReverse  /site ! 
ProxyPass    /http://127.0.0.1:8080 
ProxyPassReverse  /http://127.0.0.1:8080 

不過,我會想知道,爲什麼呢?將此指令放在LocationMatch標籤之外的影響是什麼?而且,最重要的是,爲什麼我不能使用LocationMatch完成相同的結果?

回答

4

我認爲錯誤是相當清楚的:

ProxyPass|ProxyPassMatch can not have a path when defined in a location. 

the documentation,像LocationLocationBlock上下文塊內的ProxyPass指令不接受一個路徑:

When used inside a <Location> section, the first argument is omitted and the local directory is obtained from the <Location> . The same will occur inside a <LocationMatch> section; however, ProxyPass does not interpret the regexp as such, so it is necessary to use ProxyPassMatch in this situation instead.

你因爲您嘗試使用路徑而出現錯誤:

ProxyPass    /site ! 

您可以嘗試通過使用多個<Location>部分,這樣在理論上解決此問題:

<Location /> 
    ProxyPass http://backend/ 
</Location> 

<Location /site> 
    ProxyPass ! 
</Location> 

ordering of these sections is important

您在LocationMatch塊之外使用ProxyPass指令的解決方案可能是最簡單的解決方案。請注意,您的LocationMatch指令是不正確的。 LocationMatch的參數是一個正則表達式,而/*只會匹配僅包含/個字符的網址。也就是說,它會匹配////////////等。我認爲你的意思是/.*。正則表達式中的*表示「前一個字符,零次或多次」。

+0

好吧,我明白了。謝謝!我會使用'Location'來嘗試你的解決方案。但是,通過不使用「位置」,有什麼區別?在文件中直接設置這些代理值與「VirtualHost」本身或「Directory」的設置相同?這種方法有什麼問題? – Luiz

+0

如果只使用'Location'塊來設置'ProxyPass',我不確定使用'Location'與使用配置文件頂層的'ProxyPass'有很大區別。我猜如果你在'Location'部分做的不僅僅是'ProxyPass',你可能更願意將相關的配置元素放在一起。 – larsks