nginx通配符 / 无法将路由转发到服务器端口

server {
        listen 443 ssl;
        server_name www.xxx.xxx.pro;
        ssl_certificate cert/5862364_www.xxx.xxx.pro.pem;
        ssl_certificate_key cert/5862364_www.xxx.xxx.pro.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
        ssl_prefer_server_ciphers on;
        location / {
                proxy_pass http://127.0.0.1:14856/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_redirect off;
                try_files $uri $uri/ =404;
        }
}

nginx是这样配置的,拿其中一个get接口请求为例:www.xxx.xxx.pro/todo/find,返回404,而我用curl http://127.0.0.1:14856/todo/find在服务器上请求是有返回的。
并且我将proxy_pass http://127.0.0.1:14856/改成proxy_pass http://127.0.0.1:14856/todo/find,前端直接用www.xxx.xxx.pro访问到了/todo/find这个接口。
我自己理解的应该是nginx把我所有的请求都请求到http://127.0.0.1:14856上了,后面并没有路由,所以才会404的,我现在整个服务只提供接口,所以用通配符 / 应该没毛病吧?求大神支招!
【补充】以上前端请求都是用的https
【补充】尝试使用

rewrite ^/api/(.*?) /$1 break;
proxy_pass http://127.0.0.1:14856;

也是一样,不同的是404是这样返回的:
image.png
而之前的404是这样的:
image.png
【补充】日志:
image.png
【补充】查看error.log发现问题在哪了,但是不知道问题产生的原因:
image.png

【解决】
猜测的原因是location中的try_files $uri $uri/ =404;这个配置把我的请求当成访问静态资源了,所以才会出现错误日志中的情况,注释掉之后接口可以正常访问了。
也只是猜测,有明白的大佬可以指点一二。

阅读 4.4k
3 个回答

listen 443

是不是前端没写 https 请求到 80 了?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题