Nginx
即使使用競爭位置正則表達式也使 nginx 重定向到 HTTPS
server {...}
我在 nginx塊中有以下配置:location /someapp { if ( $https != "on" ) { return 301 https://$server_name$request_uri; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php-fpm.sock; } }
問題是:
- 當我訪問
http://example.com/someapp/somefile.html
(或只是/someapp
)時,我被重定向到 HTTPS,- 但是當我訪問時
http://example.com/someapp/somefile.php
,我沒有被重定向到 HTTPS。順便說一句,這與doc一致,即:
為了找到與給定請求匹配的位置,nginx 首先檢查使用前綴字元串(前綴位置)定義的位置。其中,匹配前綴最長的位置被選中並記憶。然後按照它們在配置文件中出現的順序檢查正則表達式。正則表達式的搜尋在第一次匹配時終止,並使用相應的配置。如果找不到與正則表達式的匹配項,則使用前面記住的前綴位置的配置。
所以 when
location ~ \.php$
is a match,location /someapp
被忽略,即使請求是 for.../someapp/somefile.php
。將
location ~ \.php$ {...}
塊放在父location /someapp {...}
塊之外不會改變這種行為。如何將每個 HTTP 重定向到 HTTPS 請求,
/someapp
而不if
必將and行複製return
到 php 位置塊中?
我的建議是
server { server_name example.com *.example.com; listen 80; listen [::]:80; return 301 https://$host$request_uri; }
這將為埠 80 創建一個基本伺服器,並告訴瀏覽器永久使用 443