问题描述:
我使用docker部署的nginx服务,nginx内部是80端口,映射到宿主机上的5001端口上,nginx的内部配置如下:
upstream upstream
{
server xx.xx.xx.xx:8080;
}
server {
listen 80;
server_name xx.xx.xx.xx;
#charset koi8-r;
#for server access logs.
if ( $time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})" ) {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
set $minutes $5;
set $seconds $6;
}
proxy_http_version 1.1;
proxy_read_timeout 10s;
proxy_connect_timeout 5s;
access_log logs/${server_name}_access_log.$year-$month-$day main;
access_log logs/status_log.$year-$month-$day mini;
location /page{
gzip_static on;
alias /cloud/data/page/build/;
try_files $uri $uri/ /index.html =404;
index index.html;
#manifest.json;
expires -1s;
error_page 404 /console/index.html;
}
location ~ ^/(api)/ {
proxy_pass http://upstream;
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 From apprelease;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
当我在浏览器访问http://xx.xx.xx.xx:5001/page时,浏览器地址会变为http://xx.xx.xx.xx/page/
即把端口号给丢了。
问题原因:
发现是try_file的原因,try_file匹配到之后会执行重定向操作,nginx重定向是默认采用绝对路径,此时重定向是发生在在容器中,所以重定向返回的地址为 nginx的端口即80端口,我们看到的现象就是端口丢失了。
问题解决:
禁用绝对路径重定向,此时将会使用相对路径重定向。
即在server节点下加入
absolute_redirect off;
如下图所示;