问题描述:
我使用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;
如下图所示;