这是有关 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;
}