Symbol wieloznaczny / wyrażenie regularne Nginx w ścieżce lokalizacji

22

Konfiguracja Nginx, którą mam, rzuca 404 za .php:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Jednak w podfolderze mam plik index.php, który chcę uruchomić. Obecna konfiguracja wygląda następująco:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

działa idealnie, ale problemem są zduplikowane lokalizacje, a jeśli jest wiele podstron, konfiguracja staje się ogromna.

Próbowałem znaku wieloznacznego jak * i niektóre wyrażenie regularne, co oznacza, że ​​test nginx przeszedł pomyślnie, ale nie ładuje strony, tj. 404. Próbowałem:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

Czy jest jakiś sposób, aby mieć w nazwie jakąś ścieżkę jako wyrażenie regularne lub symbol wieloznaczny?


źródło

Odpowiedzi:

32

=Modyfikator w locationbloku jest dokładne dopasowanie, bez symboli wieloznacznych, dopasowanie prefiksu lub wyrażeń regularnych. Dlatego to nie działa.

Podczas próby wyrażenia regularnego [a-z]dopasowuje pojedynczy znak między ai z. Dlatego to nie działa dla ciebie.

Musisz skonfigurować swoje lokalizacje w następujący sposób. Zwróć uwagę na kolejność locationinstrukcji. nginx wybiera pierwszy pasujący warunek wyrażenia regularnego.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Używam tu rozróżniania wielkości liter ( ~modyfikator zamiast ~*). W pierwszym przypadku dopasowuję pierwszą część ścieżki, następnie jeden lub więcej znaków alfabetu / cyfr, a następnie index.php. Możesz zmodyfikować zakres dopasowania, ale pamiętaj +o „jednym lub więcej” powtórzeniach.

Drugi pasuje do dowolnego identyfikatora URI kończącego się na .php. Nie potrzebujesz dodatkowych znaków w swojej wersji ze względu na sposób działania wyrażeń regularnych.

Tero Kilkanen
źródło
dzięki, tak, najważniejszej rzeczy brakowało powtórzenia w wyrażeniu regularnym. +naprawione.
1

Kolejność jest ważna, z opisu „lokalizacji” nginx :

Aby znaleźć lokalizację pasującą do danego żądania, nginx najpierw sprawdza lokalizacje zdefiniowane za pomocą ciągów prefiksów (lokalizacje prefiksów). Spośród nich wybrano i zapamiętano lokalizację z najdłuższym pasującym prefiksem. Następnie sprawdzane są wyrażenia regularne w kolejności ich pojawienia się w pliku konfiguracyjnym. Wyszukiwanie wyrażeń regularnych kończy się przy pierwszym dopasowaniu i używana jest odpowiednia konfiguracja. Jeśli nie zostanie znalezione dopasowanie do wyrażenia regularnego, zostanie użyta konfiguracja zapamiętanej wcześniej lokalizacji prefiksu.

To znaczy:

  • Po pierwsze =. (dopasowanie „najdłuższy pasujący prefiks”)
  • Potem ukryte. (dopasowanie „najdłuższy pasujący prefiks”)
  • Następnie regex. (pierwszy mecz)

Musisz dostosować kolejność wyrażeń regularnych.

Gea-Suan Lin
źródło