在我的 nginx 配置文件 https-example.conf 中,它看起来像这样:
server {
listen 443 proxy_protocol http2;
server_name example;
location / {
return 301 https://www.example.com$request_uri;
}
}
这意味着对于任何对 example.com 的请求,它都会重定向到www.example.com。这基本上没问题,但由于(我之外的)原因,我无法改变这种行为。
但是,Google 会使用一个名为 assetlinks.json 的文件来验证 Web 和 Android 应用是否已连接。此文件应可在 example.com/.well-known/assetlinks.json 上访问并返回 200。但是,它返回 301 并重定向到www.example.com/.well-known/assetlinks.json这意味着谷歌无法验证它。
我需要修复此行为。该文件实际上托管在 S3 存储桶中;在 https-www-example.conf 文件(处理大多数配置的地方)中,有以下块:
location = /.well-known/assetlinks.json {
proxy_pass http://s3-bucket.aws.com/files/.well-known/assetlinks.json;
}
这可以正常工作(它提供文件在www.example.com/.well-known/assetlinks.json)。我尝试将此块放入 https-example.conf,但没有成功(仍然重定向到 www.)。ChatGPT 建议使用代替,location ^~
但location =
同样没有成功。最后,ChatGPT 建议return 301...
用以下代码替换此行:
location / {
if ($request_uri !~* ^/.well-known/assetlinks.json$) {
return 301 https://www.example.com$request_uri;
}
}
这有效!当我对 example.com/.well-known/assetlinks.json 使用 curl 请求时,它返回 200。它实际上只对与 ./well-known/assetlinks.json 不匹配的路径执行 301 重定向规则。
但是,我不喜欢这里的条件;我知道这不是 nginx 的最佳实践。有没有更好的方法可以做到这一点,而不需要条件?
答案1
好吧,如果我回答正确,请解雇 ChatGPT。实际上,它还是会因为在 Nginx 中推荐“if”而解雇它,尽管这没有必要。
server {
listen 443;
server_name example.com;
location = /.well-known/assetlinks.json {
proxy_pass http://s3-bucket.aws.com/files/.well-known/assetlinks.json;
break;
}
location / {
return 301 https://www.example.com$request_uri;
}
}
server {
listen 443 proxy_protocol http2;
server_name www.example.com;
...
location / {
...
}
}