jak usunąć blok lokalizacji z $ uri w konfiguracji nginx?

16

Mam przepisany plik ngng conf, który działa poprawnie, ale wydaje się, że zawiera blok lokalizacji jako część zmiennej $ uri. Chcę tylko ścieżki po bloku lokalizacji. Mój obecny kod konfiguracji to:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

Korzystając z przykładowego http://localhost/cargo/testpageadresu URL przekierowania, działa jednak wartość parametru „_REWRITE_COMMAND” otrzymana przez mój plik php to „/ cargo / testpage”. Muszę zdjąć blok lokalizacji i po prostu mieć „stronę testową” jako $ uri

Jestem prawie pewien, że istnieje składnia wyrażenia regularnego do podziału $ uri i przypisania jej do nowej zmiennej za pomocą 1 $ 2 $ itp., Ale nie mogę znaleźć żadnego przykładu wykonania przypisania zmiennej za pomocą wyrażenia regularnego, które nie jest częścią przepisywania komunikat. Szukałem i próbowałem od wielu godzin i po prostu nie mogę przejść tego ostatniego kroku.

Wiem też, że mógłbym po prostu usunąć to z kodu aplikacji, ale powód, dla którego chcę spróbować go naprawić w conf nginx, wynika z powodów kompatybilności, ponieważ działa on również na Apache. Ja też powinien powiedzieć, że zorientowali się, naprawdę hacky sposób to zrobić, ale to wiąże się z „if” w celu sprawdzenia istnienia pliku i specjalnie przygotowanej dokumentacji mówi nie zrobić to w ten sposób.

Jason
źródło

Odpowiedzi:

18

Rozglądając się, sądzę, że najłatwiejsze jest użycie wyrażenia regularnego z przechwytywaniem. Dostosowując twój przykład, kończę na:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}
Theuni
źródło
aha, takie proste, gdy ktoś ci to wskaże! Musiałem wprowadzić kilka drobnych poprawek, aby obsłużyć przepisywanie adresu URL roota do właściwej lokalizacji. Podaję odpowiedź na pytanie, ponieważ nie mogę wykonać żadnego formatowania w tym komentarzu. Jedynym zastrzeżeniem jest to, że blok php musi teraz znajdować się powyżej tego bloku lokalizacji, w przeciwnym razie tworzona jest nieskończona pętla przekierowania (ponieważ wyrażenie / cargo jest wyrażeniem regularnym, a adres URL przekierowania zawiera również / cargo). Nie jesteś pewien, czy istnieje inny sposób, aby temu zapobiec?
Jason
Zalecam przeczytanie na temat zamawiania lokalizacji wyrażeń regularnych i nieregexp. Zwykle w pewnym momencie zwracam się do wyrażenia regularnego wszystkich lokalizacji, ponieważ wtedy kolejność zależy od kolejności w pliku konfiguracyjnym, a nie od specyficzności dopasowania.
Theuni
fajne dzięki, wyobrażałem sobie, co sprawiłoby, że powyższy regex byłby lepszy, gdyby pasował / cargo / (cokolwiek oprócz index.php), to zapobiegłoby błędowi serwera z powodu nieskończonej pętli przepisywania.
Jason
3

Znalazłem inną rzecz, która zadziałała dla mnie (kiedy używam gunicorn, nie mogę wybrać, co przekazać)

Powinieneś być w stanie uciec

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}
g3rv4
źródło
1

W przypadku osób, które mogą mieć problem z dodaniem go do usługi mikro lub interfejsu API za pomocą Node JS, użyłem następującego narzędzia do usunięcia apiz adresu URL na moim serwerze:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
George Mylonas
źródło