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 的错误!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐