背景

前端工夫上线我的项目的时候,因为第一次上线没有教训。报了几个谬误。

405 Not allowed

过后的nginx.conf配置

server {    listen       80 default_server;    listen  [::]:80 default_server;    access_log  /var/log/nginx/host.access.log  main;    location / {        root   /usr/share/nginx/html;        index  index.html index.htm;        try_files $uri $uri/ /index.html;    }    location /api/ {        proxy_pass http://gitlabwebhooktogithub-api:8088/;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }    #error_page  404              /404.html;    # redirect server error pages to the static page /50x.html    #    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }}
405 报错

服务器上应用 nginx 启动的时候 并拜访如下时,报了 405 Not allowed 异样

http://gitlab-webhook-to-github.xxxxxx:17081

去谷歌了一下,说是这个问题呈现的起因是因为应用了 post 申请去获取动态资源,

我感觉很奇怪,明明是用post申请后盾接口,为什么变成申请动态资源,是因为我的项目打包后变成动态了吗?

感觉可能对动态资源了解不对,抱着这个想法,我把动态资源的概念又梳理了一遍:

动态资源:指的就是在 js/css/jpg/png/xxx.json... 等等这些在前端工程中须要提前配置或者编译之后的文件,而且这些文件并不会时刻变动或者说变动周期比拟长。
同时 Apache、IIS、Nginx等绝大多数web服务器,都不容许动态文件响应POST申请。
尝试解决

同时,那篇文章上面还给了解决形式:

在 location 中配置 error_page,这个解决问题的思路是将 post 申请转换成 get 申请,配置信息如下:

server {    listen       80;    server_name  域名;   location /{       root /www/文件目录;       index index.html index.htm index.php;       error_page 405 =200 http://$host$request_uri;    } }

然而没有成果,报错仍旧。

查看后盾是否收到申请

既然办法没有成果,那就看看后盾服务的日志有没有收到申请。

于是在application.yml 增加了 日志性能,将日志打印到本目录到 my.log 文件中

server:  port: 8088logging:  file: my.log

在后盾的接口上打印信息,若收到申请,则打印。
logger.info("接管到申请");

查看日志: 后盾没有收到申请

也就是说所有的申请(包含 get)都没有达到后盾

于是我又去查看了 url 以及 nginx配置

location /api/ {    proxy_pass http://gitlabwebhooktogithub-api:8088/;    proxy_set_header Host $host;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}

须要加上 api 后缀,能力转发给后盾。真是粗枝大叶

301 Moved Permanently

加上 api 后缀后, url为

http://gitlab-webhook-to-github.xxxxxx:17081/api 

之后又产生了新的报错: 301 Moved Permanently

<html><head><title>301 Moved Permanently</title></head><body><center><h1>301 Moved Permanently</h1></center><hr><center>nginx/1.23.1</center></body></html>

为啥服务端会返回301呢?

首先须要弄清楚状态码的含意, HTTP协定中3xx结尾的状态响应码都是示意重定向的响应。依据RFC的定义:

  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 307 Temporary Redirect

301是永恒重定向。如果应用Nginx作为HTTP服务器,那么当用户输出一个不存在的地址之后,基本上会有两种状况:

  1. 返回404状态码,
  2. 返回301状态码和重定向地址。只说下301 Moved Permanently的处理过程。

上面这种状况 Nginx 会被动设置3 01 Moved Permanently 状态码:

当用户在浏览器输出了一个url地址,开端局部是一个文件目录且不以斜杠”/“结尾,比方 “www.baidu.com/index” 。Nginx没有找到index这个文件,但发现了index是个目录。于是本次拜访的返回状态码就会被设置成301 Moved Permanently。

流程图:

起因就是: url对应的地位为目录

再去后盾找发现: @RequestMapping("")

猜测是不是须要加 / 能力失常拜访此controller

@RestController@RequestMapping("")@Slf4jpublic class GitLabController {    @Autowired    private NotifySchedule notifySchedule;    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)    public ResponseEntity pushHook(@RequestBody String json,                               @RequestHeader(name = "X-Gitlab-Event") String event,                               @RequestHeader(name = "X-Gitlab-Token", required = false) String secret) {        if (secret == null) {            ResponseVo body = ResponseUtil.error(HttpStatus.UNAUTHORIZED,"未在零碎中增加secret, 申请失败");            return  new ResponseEntity<>(body, HttpStatus.UNAUTHORIZED);        }       return notifySchedule.putIntoMap(json, event, secret);    }}

之后又在 api 下 加了个斜杠 /

http://gitlab-webhook-to-github.xxxxxx:17081/api/

果然拜访胜利。


为什么重定向主动加的斜杠不失效

回过头一想, 重定向的时候不是主动加上了 斜杠/ ,为什么也没有胜利?

再去重定向的地址一看:没有主动加上 端口号,导致重定向失败

总结:

第一个谬误,url不对导致没有转发给后盾
第二个谬误,url不对导致没有拜访到正确的controller