我在 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
没有是否必须将if
和return
行复制到 php 位置块中?
答案1
我的建议是
server {
server_name example.com *.example.com;
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
这将为端口 80 创建一个基本服务器,并告诉浏览器永久使用 443