【问题标题】:Nginx returns 404 for proxied requests, but return 200 when directly accessingNginx代理请求返回404,直接访问返回200
【发布时间】:2020-05-21 15:26:24
【问题描述】:

目标是支持 mydomain.tld/blog 与托管 mydomain.tld 的 netlify 一起工作。

我从 netlify _redirects 文件代理如下/blog/* http://BLOG_IP/blog/:splat 200

我在路径BLOG_IP/blog 上有一个幽灵博客。当我访问此 URL 时,该博客可以正常使用以下 Nginx 访问日志

// Directly accessed
MY_IP - - [21/May/2020:15:10:29 +0000] "GET /blog/ HTTP/1.1" 200 4935 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"

当我尝试通过 mydomain.tld/blog 时,我收到 404 Nginx 错误,并显示以下访问日志。

// Proxied through Netlify
NETLIFY_IP - - [21/May/2020:15:10:25 +0000] "GET /blog/ HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"

Netlify 代理运行良好。这是完全相同的请求,但不知何故,一个是 200,另一个是 404。如您所见,两者都在访问"GET /blog/ HTTP/1.1" 路由。

这是我的 Nginx 配置

server {
    server_name MY_DOMAIN;
    root /var/www/ghost/system/nginx-root; # Used for acme.sh SSL verification (https://acme.sh)

    location ~ ^/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
        proxy_redirect off;
    }

    location ~ /.well-known {
        allow all;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/MY_DOMAIN/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/MY_DOMAIN/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    client_max_body_size 50m;
}
server {
    if ($host = MY_DOMAIN) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name MY_DOMAIN;
    return 404; # managed by Certbot
}

我的幽灵配置是

{
  "url": "https://MY_DOMAIN/blog",
  "server": {
    "port": 2368,
    "host": "127.0.0.1"
  },
  ...
}

我有两个问题: 1)为什么代理请求与直接请求之间存在不一致? 2)如何在使用Netlify作为ghost服务器时实现MY_DOMAIN/blog

【问题讨论】:

    标签: nginx proxy reverse-proxy netlify ghost-blog


    【解决方案1】:

    根据您在 Netlify /blog/* http://BLOG_IP/blog/:splat 200 的代理规则 您传递的是 BLOG_IP(直接 IP 地址)而不是 HOST 标头。 因此这条规则return 404; # managed by Certbot 是首先发生的,这就是你得到 404 的原因。 当您尝试直接访问 mydomain.tld 时,您的浏览器会正确地将主机标头发送到您的 Nginx 代理服务器,因此第一个重定向规则生效,您将获得 200 个 http 代码。

    可能的解决方案是从以下位置更改重定向规则: return 301 https://$host$request_uri; 到: return 301 https://$server_name$request_uri;

    或者注释掉return 404;

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多