阻止特定路径的 nginx 重定向规则

阻止特定路径的 nginx 重定向规则

在我的 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 / {
     ...

  }
}

相关内容