Nginx反向代理配置使Mojolicious $self->req->url->to_abs丢弃端口号



在实现"快速且肮脏"的web资源链接共享功能时陷入困境,该功能应根据以下场景工作:

  • 用户列出数据库中的项目,点击编辑
  • 系统打开所选应用程序的编辑模式对话框
  • 系统在this应用程序实例中显示this项目的链接,这样用户就可以通过几个选项卡Ctrl+C或Cmd+Cit

所以我在mojolicus模板中有以下代码,Mojolicus在没有nginx反向代理的情况下运行时,将其完美地转换为正确的绝对url:

<input id="modal-dia-share-lnk" @focus="this.document.execCommand('selectAll',false,null)"
:value="'<%=  $self->req->url->to_abs =%>?&'+'with=id-eq-'+this.$attrs.id.replace('dia-','')" readonly>

翻译成

http://host-name:8082/qto/list/monthly_issues_202004?&with=id-eq-200327122837哪个HAS端口

但是,当在反向代理后面运行时,它省略了端口,所以即使我在441端口上运行生成的url是否NOT具有端口http://qto.fi/qto/list/monthly_issues_202004?&with=id-eq-200325163720

在这种设置中,这是不可接受的,因为dev的Mojo应用程序层必须侦听端口441,而prd必须侦听端口443

您实际上可以在以下两种情况下获得场景:

  • dev中的qto应用层实例
  • prd中的qto-app层实例

只需单击"确定"即可使用默认匿名用户登录。。。

我可以根据应用程序的现有配置构建url,但我想应该有一个快速的nginx破解,通过在location指令中的一些regex或其他东西来实际包括端口。。。

这是反向代理conf:

server {
listen 443 ssl;
server_name qto.fi;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/qto.fi/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/qto.fi/privkey.pem;
location / {
proxy_pass http://localhost:8080/;
proxy_http_version 1.1;
proxy_pass_header Authorization;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 10s;
}
}

开发站点还有以下http-conf:

server {
listen 78;
listen [::]:78;
server_name qto.fi;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
proxy_pass http://localhost:8078/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
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 X-Forwarded-For
$proxy_add_x_forwarded_for;
# ....
}
}

将端口添加到nginx反向代理conf:中的Host标头

proxy_set_header Host $host:443;

proxy_set_header Host $host:$server_port;

一种基于ttubrian答案的变通方法,但仍然不是真正的解决方案可能是

通过proxy_set_header Host $host:78;构建url

因此https conf看起来如下:

server {
listen 441 ssl;
server_name qto.fi;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/qto.fi/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/qto.fi/privkey.pem;
location / {
proxy_pass http://localhost:8078/;
proxy_http_version 1.1;
proxy_pass_header Authorization;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Scheme $scheme;
proxy_set_header Host $host:78;
proxy_read_timeout 10s;
}
}

它生成以下类型的url:

http://qto.fi:78/qto/list/problems?&with=id-eq-200325184202

并在http-dev conf:中添加http->https强制执行

return 301 https://$host:441$request_uri;

因此dev-conf看起来如下:

server {
listen 78;
listen [::]:78;
server_name qto.fi;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
return 301 https://$host:441$request_uri;
location / {
proxy_pass http://localhost:8078/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
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 X-Forwarded-For
$proxy_add_x_forwarded_for;

最新更新