Am următoarea configurație în interiorul unui nginx Server {...}
bloc:
locație /o aplicație {
dacă ( $https != „pornit” ) {
returnează 301 https://$server_name$request_uri;
}
locație ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
}
}
Problema este că:
- când accesez
http://example.com/someapp/somefile.html
(sau doar /o aplicație
), sunt redirecționat către HTTPS,
- dar când accesez
http://example.com/someapp/somefile.php
, nu sunt redirecționat către HTTPS.
Apropo, acest lucru este în concordanță cu doc, asta spune:
Pentru a găsi locația care se potrivește cu o anumită solicitare, nginx verifică mai întâi locațiile definite folosind șirurile de prefix (locații de prefix). Printre acestea, locația cu cel mai lung prefix care se potrivește este selectată și reținută. Apoi se verifică expresiile regulate, în ordinea apariției lor în fișierul de configurare. Căutarea expresiilor regulate se termină la prima potrivire și este utilizată configurația corespunzătoare. Dacă nu se găsește nicio potrivire cu o expresie regulată, atunci se utilizează configurația locației prefixului amintită mai devreme.
Deci când locație ~ \.php$
este o potrivire, locație /o aplicație
este ignorată, chiar dacă cererea este pentru .../someapp/somefile.php
.
Având locație ~ \.php$ {...}
blocați în afara părintelui locație /o aplicație {...}
bloc nu schimbă acest comportament.
Cum pot redirecționa fiecare solicitare HTTP către HTTPS către /o aplicație
fără trebuind să dubleze dacă
și întoarcere
linii în blocul de locație php?