Nginx

即使使用競爭位置正則表達式也使 nginx 重定向到 HTTPS

  • March 31, 2022

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

引用自:https://serverfault.com/questions/1097219