2017-09-04 75 views
5

Muszę przekierować wszystkie żądania apache na 80 na tomcat na 8080, z wyjątkiem jednej ścieżki.Błąd Apache ProxyPass

Tak więc, jeśli otrzymasz http://example.com/anything -> tomcat: 8080.

Ale jeśli adres URL jest następujący: http://example.com/site -> serwer Apache powinien działać i nie jest potrzebne przekierowanie.

Obecnie istnieje folder o nazwie site wewnątrz /var/www/html/.

To jest mój aktualny plik konfiguracyjny:

site.conf(plik ten zawiera jedynie następujące i znajduje się wewnątrz folderu conf.d)

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

myślę, że to jest prostą rzeczą do osiągnięcia z Apache, ale próbowałem wszystkiego, co mogłem znaleźć i nadal otrzymuję błąd:

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

Chodzi o to, że strona główna działa na tomcat, ale druga działa na apache (ten, który nazwałem strona w tym pytaniu).

Jeśli ktoś może pomóc, doceniam.

Dzięki!

Update 1 - 09/06/2017

mogę zmusić go do pracy jeśli usunąć LocationMatch i umieścić ProxyPass bezpośredni w pliku .conf:

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

Ale chciałbym lubię wiedzieć, dlaczego tak jest? Jaki jest wpływ umieszczenia tych dyrektyw poza tagiem LocationMatch? I, co najważniejsze, dlaczego nie mogę osiągnąć tego samego wyniku za pomocą LocationMatch?

Odpowiedz

4

Myślę, że błąd jest całkiem jasne:

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

Według the documentation, wewnątrz bloku kontekstowego jak Location lub LocationBlock dyrektywa ProxyPass nie akceptuje ścieżkę:

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.

Jesteś uzyskanie błędu, ponieważ próbujesz użyć ścieżki:

ProxyPass    /site ! 

można spróbować rozwiązać ten teoretycznie przy użyciu wielu <Location> sekcje, tak:

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

<Location /site> 
    ProxyPass ! 
</Location> 

ordering of these sections is important.

Twoje rozwiązanie użycia dyrektyw ProxyPass poza blokiem LocationMatch jest prawdopodobnie najprostszym rozwiązaniem.


Na marginesie, twoja dyrektywa LocationMatch jest niepoprawna. Argument do LocationMatch jest wyrażeniem regularnym, a /* odpowiada tylko adresom URL składającym się tylko z / znaków. Oznacza to, że pasowałoby do / lub // lub ///////// itp. Myślę, że naprawdę chodziło o /.*. * w wyrażeniu regularnym oznacza "poprzedni znak, zero lub więcej razy".

+0

Ok, rozumiem. Dzięki! Wypróbuję Twoje rozwiązanie za pomocą 'Lokalizacja'. Ale, nie korzystając z "Lokalizacja", jakie są różnice? Ustawienie tych wartości proxy bezpośrednio w pliku jest takie samo jak ustawienie dla 'VirtualHost' lub' Directory'? Czy są jakieś problemy z tym podejściem? – Luiz

+0

Nie jestem pewien, czy jest duża różnica, używając 'Location' zamiast po prostu używając' ProxyPass' na najwyższym poziomie pliku konfiguracyjnego, jeśli używasz bloku 'Location' do ustawienia' ProxyPass'. Sądzę, że gdybyś robił więcej w sekcji 'Location' niż po prostu' ProxyPass', możesz chcieć trzymać razem powiązane elementy konfiguracji. – larsks