本人在网站搭建过程中,遇到了非标准端口 301 重定向问题,特记录解决方案以供参考。
同理 302 和 307 也可以这么处理。
当然,如果有条件,最好设置listen端口和访问时的端口一直,这样才能从源头上解决非标端口访问的问题。
本人使用 Nginx Proxy Manager 进行管理和部署,使用的是 openresty,配置经过本人使用无问题。
首先,需要配置好主要的nginx配置文件
#全局块
#user nobody;
worker_processes 1;
#http块
http {
#http全局块
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#server块
server {
#server全局块
listen 8000;
server_name localhost;
#location块
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#这边可以有多个server块
server {
...
}
}
然后,将下面的代码放入server块即可。
其中:suibianshudianshenme
是可以自定义的,最好配置随机字符,防止外部访问。
最后一行以端口号8000为例子,自己可以根据实际情况进行修改。
# 后端错误页面过滤
proxy_intercept_errors on;
# 301 跳转过滤,为了区别后端代理服务器的跳转和 Nginx 本身的跳转
error_page 301 /suibianshudianshenme/$location?$args;
location ~ /suibianshudianshenme/(?<original_location>.+){
internal;
# 测试用,用于观察输出情况
#more_set_headers 'Test:$upstream_http_location';
#more_set_headers 'Test2:$location';
#more_set_headers 'Test3:$original_location';
#more_set_headers 'Test4:$args';
#more_set_headers 'Test5:$original_args';
#return 404;
# 如果后端代理的服务器返回了301,就按照后端返回的地址进行跳转
if ($upstream_http_location !~ "^$"){
more_set_headers -s '301' 'Location:$upstream_http_location';
return 301;
}
# 其余情况按照原来的目的地址进行跳转
# 如果原始链接就存在查询参数,就进行拼接
if ($args !~ "^$"){
set $original_args ?$args;
}
return 301 https://$host:8000$original_location$original_args;
}