背景
前端工夫上线我的项目的时候,因为第一次上线没有教训。报了几个谬误。
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: 8088
logging:
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 服务器,那么当用户输出一个不存在的地址之后,基本上会有两种状况:
- 返回 404 状态码,
- 返回 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("")
@Slf4j
public 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