gpt4 book ai didi

ssl - Nginx 代理传递给反向代理

转载 作者:行者123 更新时间:2023-12-04 22:42:59 25 4
gpt4 key购买 nike

我对 nginx 相当陌生,并且坚持使用当前配置。
我还检查了ssl - nginx does redirect , nginx as proxy for web app , nginx proxy_pass , nginx proxy rewriteanother post related to my question .
我还查看了其他一些现在对我没有帮助的帖子。我没有阅读所有关于 nginx 主题的大约 21500 篇帖子和 proxy .
谷歌也未能引导我找到解决方案。
当前设置是:[CMS (Plone in LAN)]<--->[Reverse-Proxy (Apache / http://oldsite.foo)]这是旧的站点设置。基本上我们需要重新设计 CMS。但它已经成长为至少有两个开发人员(他们从未见过彼此)的大量依赖项和自行编写的模块。将其正确更换将是仅一年的任务。 Apache 配置中也有一些奇怪的东西,所以我们现在不能避免使用 Apache。
不幸的是,我们需要尽快进行光学重新设计。
所以我们想到了在 Nginx 中使用 Diazo/XSLT 来重新设计旧网站并向我们的评估者展示一些结果。
因此我尝试以下设置:[Plone]<--->[Apache]<--->[Proxy (XSLT in Nginx / https://newsite.foo)]这是我的xslt_for_oldsite配置文件(Cache-Control 仅用于调试):

add_header Cache-Control no-cache;

server {
server_name newsite.foo;
server_tokens off;

listen b.b.b.b:80;

return 301 https://$server_name$request_uri;

access_log /var/log/nginx/newsite.port80.access.log;
error_log /var/log/nginx/newsite.port80.error.log;
}

server {
server_name newsite.foo;
server_tokens off;

listen b.b.b.b:443 ssl;

access_log /var/log/nginx/newsite.port443.access.log;
error_log /var/log/nginx/newsite.port443.error.log;

ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5:!ADH:!AECDH;
ssl_session_cache shared:SSL:5m;

proxy_http_version 1.1;

#proxy_set_header X-Forwarded-Host $host:$server_port;
#proxy_set_header X-Forwarded-Server $host;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# proxy_set_header Connection "";
# proxy_ignore_headers Expires;

# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-forwarded-host $host;

sub_filter_types *;
sub_filter_once off;
sub_filter "http://oldsite.foo" "https://newsite.foo";

location / {
proxy_pass http://oldsite.foo/;
proxy_redirect off;
#proxy_redirect http://oldsite.foo/ https://newsite.foo/;
proxy_set_header Host $host;
}
}
如果我启动浏览器连接到 http://oldsite.foo然后它加载:
  • 1 个来自旧站点的 HTML 文档
  • 来自旧网站的 3 个 CSS 文件
  • 来自旧站点的 9 个 JS 文件
  • 来自旧网站
  • 的 10 个图形文件

    但是如果我使用浏览器获取 https://newsite.foo然后它加载:
  • 1 个来自新闻网站的 HTML 文档
  • 仅来自 的 5 个图形文件旧址 (来自我的浏览器的直接请求)
  • 其他一切都不见了

  • 而使用 wget https://newsite.foo -o index.html 接收的 HTML 文档已将所有链接修改为 https://newsite.foo (正确地将 http://oldsite.foo 替换为 https://newsite.foo )浏览器显示所有未修改的链接: http://oldsite.foo而不是 https://newsite.foo .
    我得到以下服务器 header curl -I https://newsite.foo :
    HTTP/1.1 200 OK
    Server: nginx
    Date: Fri, 11 Sep 2020 10:28:15 GMT
    Content-Type: text/html
    Connection: keep-alive
    Accept-Ranges: none
    Accept-Ranges: bytes
    X-Varnish: 1216306480
    Age: 0
    Via: 1.1 varnish
    Set-Cookie: I18N_LANGUAGE="de"; Path=/
    Via: 1.1 oldsite.foo
    Vary: Accept-Encoding
    Cache-Control: no-cache
    我玩弄了 add_header , proxy_set_headerproxy_redirect .我也试过
    location ~* .* {
    proxy_pass http://oldsite.foo$request_uri;
    proxy_redirect off;
    proxy_set_header Host $host;
    }
    但是我的任何更改都没有改变 nginx 的行为,它将 GET 请求重定向到 http://oldsite.foo并显示答案,就好像它们来自 https://newsite.foo .
    我对这些问题没有答案:
  • 为什么我的浏览器一直连接到 http://oldsite.foo ?它应该连接到 https://newsite.foo .
  • 为什么 wget 版本之间的 HTML 中的链接不同和我的浏览器?
  • 为什么超过一半的网站无法通过 https://newsite.foo 访问浏览器?
  • 我怎样才能解决这个问题?

  • 有没有人可以指出我正确的方向?
    提前致谢。至少感谢您阅读我的帖子。
    此致。

    最佳答案

    同时我找到了解决方案。
    Apache 发送了 gzip 压缩的数据,但 sub_filter 无法处理(参见 official documentation: sub_filter)。
    事实上,我试图通过使用 proxy_set_header Accept-Encoding ""; 来避免这种情况。但它没有用。
    原因是这部分必须设置在 位置上下文 .
    因此,在撰写本文时(2020-09-15),Ubuntu 20.04 LTS、Nginx 1.14.0 的正确配置是:

    ...
    server {
    server_name newsite.foo;
    server_tokens off;

    listen b.b.b.b:443 ssl;

    access_log /var/log/nginx/newsite.port443.access.log;
    error_log /var/log/nginx/newsite.port443.error.log;

    ssl_certificate /etc/ssl/certs/nginx.crt;
    ssl_certificate_key /etc/ssl/private/nginx.key;

    # Double check and modify this part BEFORE using in production:
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5:!ADH:!AECDH;
    ssl_session_cache shared:SSL:5m;

    location / {
    proxy_http_version 1.1;
    proxy_set_header Accept-Encoding ""; # MUST be written HERE in this context!
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://oldsite.foo;
    proxy_redirect off;
    sub_filter_types text/html text/css text/javascript; # If unsure you may use '*'
    sub_filter_once off;
    sub_filter http://oldsite.foo https://newsite.foo;
    }
    ...
    感谢 adrianTNT谁为我指出了关键部分(见 the missing detail)。

    关于ssl - Nginx 代理传递给反向代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63847404/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com