无需重定向的外部域中的 Nginx 源文件夹

无需重定向的外部域中的 Nginx 源文件夹

这是有关 Nginx redirect/proxy_pass 机制的另一个问题。

我的问题如下:我有一个网站domain.tld和第二个网站blog.domain.tld。我想用的内容domain.tld/blog来获取的内容blog.domain.tld。它必须对用户不可见。所以,我猜想实现这一点的方法是使用一些围绕proxy_pass指令的东西。

我尝试过,但没有成功: server { listen 443 ssl; [...] location ~ /blog { #rewrite ^/blog(.*) https://blog.domain.tld$1 permanent; proxy_pass https://blog.domain.tld; proxy_set_header Host blog.domain.tld; } location / { proxy_pass http://localhost:8004; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }

但是我的日志中有一个 404 domain.tld $ curl -I https://domain.tld/blog HTTP/1.1 404 Not Found

我的猜测是:请求被发送到https//blog.domain.tld/blog,而它应该被发送到https://blog.domain.tld/。因此,我正在寻找一种方法来以良好的形式重写这个请求。

有什么见解吗?

更新:评论中询问的完整配置文件:

server { 
    listen 80;
    server_name zenergie.engie.happy-dev.fr energiefutee.fr;

    root /opt/zenergie/;

    location /.well-known/ {
            try_files $uri =404;
    }

    location / {
            return 301 https://$host$request_uri;
    }
}       

server {
    listen 443 ssl; 

    server_name zenergie.engie.happy-dev.fr energiefutee.fr;
    charset utf-8;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    # disable SSL protocols ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;   # remove deprecated ciphers 
    ssl_prefer_server_ciphers On;
    ssl_certificate /etc/letsencrypt/live/zenergie.engie.happy-dev.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/zenergie.engie.happy-dev.fr/privkey.pem;
    ssl_session_cache shared:SSL:128m;  
    #add_header Strict-Transport-Security "max-age=31557600; includeSubDomains";     # tell the browser to force HTTPS for one year
    ssl_stapling on;        # activate OCSP
    ssl_stapling_verify on;

    access_log /opt/zenergie/logs/access.log;
    error_log /opt/zenergie/logs/error.log;

    root /opt/zenergie/;

    location ~ /blog {
            #rewrite ^/blog(.*) https://zenenergie-blog.staging.happy-dev.fr$1 permanent;
            proxy_pass https://zenenergie-blog.staging.happy-dev.fr;
            proxy_set_header Host zenenergie-blog.staging.happy-dev.fr;
    }

    location ~ /static/ {
            add_header X-Static hit;
    }

    location ~ /media/ {
            add_header X-Static hit;
    }

    location / {
            proxy_pass http://localhost:8004;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;      
    }

}

答案1

您的博客位置应该进行重写,以从传入 URL 中删除 /blog,如下面的代码。

    rewrite ^/blog(.*) /$1 break;

但是,通常您希望将 /blog 重定向到 /blog/,因为否则博客中的任何相对 URL 都会指向错误的位置。例如,假设从 URL 返回的 htmlhttps://blog.domain.tld/引用 URL image.png。浏览器会将完整 URL 解释为 https://blog.domain.tld/image.png。如果您不重定向到 /blog/,则在https://domain.tld/blog浏览器会将该相对链接解释为http://domain.tld/图片.png代替https://domain.tld/blog/image.png简而言之,你的形象将会受损。

这也是带有重定向的版本。

    location ~ /blog {
            rewrite ^/blog$ /blog/ redirect;
            rewrite ^/blog(/.*) /$1 break;
            proxy_pass https://blog.domain.tld;
            proxy_set_header Host blog.domain.tld;
    }

相关内容