HTTP 301 状态其实并不是经常会遇到,前两天我用Nginx 部署多个应用时却遇到了这个问题,特此再记录一下。
关于HTTP 301 基础知识我就不普及了,大家要深入了解的话就自行百度。我遇到这个问题的情况是这样的,原来几个系统都是部署在一个Tomcat 下,有Springboot 应用,也有非Springboot应用,但这样就会带来一个小问题,那就是在Tomcat下的每个应用进行升级或者重新部署时就会影响到其它的在同一Tomcat下的应用,大家也许问Tomcat不是支持热部署吗?直接热部署不就可以了吗?其实不然,有些静态的配置参数、多线程安全等机制还是需要热部署之后再次重启Tomcat的,否则的话可能会导致意想不到的错误发生。所以后来我们就采用了一个新的系统部署架构,使用Nginx的反代理来实现它。
Tomcat系统部署图:
配置Nnginx后:
配置nginx
# Nginx 配置
server {
listen 80;
location / {
root /opt/nginx/html/www;
index index.html index.htm;
}error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /opt/nginx/html;
}location /a/ {
proxy_pass http://localhost:9090 ;
}
location /b/ {
proxy_pass http://localhost:9090 ;
}location /b/ {
proxy_pass http://localhost:9090 ;
}location /c/ {
proxy_pass http://localhost:9090 ;
}
location /d/ {
proxy_pass http://localhost:10000 ;}
location /d/ {
proxy_pass http://localhost:20000 ;}
location ~ /.ht {
deny all;
}
}
这些配置完成后,各个子系统也启动后,基本上一切正常,但是访问 A系统的一个特定URL时却会出301 的错误,那是因为 某个URL 也就是Controller不是使用的 A系统的 上下文,是自己独立的上下文如: A系统的上下文是 /a/ 而某一个URL 就叫他 student 吧,这个URL 下没有子目录子路径了,那么Nnginx配置 /student/ 这样的代理转发就会报 301 的错误。 所以正确的配置方法是 /student ,由此可见,配置nginx 的代码转的 URL时,要特别注意,结尾的“/” !!!
总结:
nginx 配置的 每一项 location 都应该是正确的 URL ,如果配置的 /XXXX/ 路径下已经没有子路径,那么访问~~~~/XXXX 这个路径时就会报 301 的错误!