即使存在竞争位置正则表达式,也可以使 nginx 重定向到 HTTPS

即使存在竞争位置正则表达式,也可以使 nginx 重定向到 HTTPS

我在 nginx 块中有以下配置server {...}

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。

顺便说一句,这与文档, 说的是:

为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用先前记住的前缀位置的配置。

因此当location ~ \.php$匹配时,location /someapp会被忽略,即使请求是.../someapp/somefile.php

location ~ \.php$ {...}块置于父location /someapp {...}块之外不会改变这种行为。

如何将每个 HTTP 到 HTTPS 请求重定向到/someapp 没有是否必须将ifreturn行复制到 php 位置块中?

答案1

我的建议是

server {
       
        server_name example.com *.example.com;
        listen 80;
        listen [::]:80;
        return 301 https://$host$request_uri;
}

这将为端口 80 创建一个基本服务器,并告诉浏览器永久使用 443

相关内容