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 位置块中?