Nginx xy_pass 404错误,不明白为什么

我试图把所有调用/api 到我的网络服务,但我不断得到404与以下配置。按预期调用/返回 index.html。有人知道为什么吗?

upstream backend{
server localhost:8080;
}


server {


location /api {
proxy_pass http://backend;
}


location / {
root /html/dir;
}
}

更多信息请点击这里

adept@HogWarts:/etc/nginx/sites-available$ curl -i localhost/api/authentication/check/user/email
HTTP/1.1 404 Not Found
Server: nginx/1.2.1
Date: Mon, 22 Apr 2013 22:49:03 GMT
Content-Length: 0
Connection: keep-alive


adept@HogWarts:/etc/nginx/sites-available$ curl -i localhost:8080/authentication/check/user/email
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 22 Apr 2013 22:49:20 GMT
Transfer-Encoding: chunked


{"user":["false"],"emailAddress":["false"]}
113422 次浏览

这个

location /api {
proxy_pass http://backend;
}

应该是这样的

location /api/ {
proxy_pass http://backend/;
}

由于某种原因,Nginx 的 xy _ pass 在传递到上游之前会切断头部的“ Host”,默认的服务器会捕获请求,甚至 xy _ header _ pass 也无济于事,所以我必须显式地设置它:

location / {
proxy_set_header Host $host;
proxy_pass  http://backend;
}

我忘了监听80号端口,修好了。

Nginx config 的“ http”部分,位于:/etc/nginx/nginx.conf,如下所示:

http {
server {
listen 192.111.111.11:80;
location /path1/ {
proxy_pass http://127.0.0.1:3000/path1/
}
}
}

现在,访问
Http://192.111.111.11/path1/
将得到访问的结果
Http://127.0.0.1:3000/path1/

注意:
用上面的 IP 地址替换192.111.111.11。
运行“ ifconfig”命令,“ inet addr”部分将提供您的 IP 地址

只是想提醒其他人,您的 xy _ pass url 后面的斜杠(后端 */*)非常重要!

如果配置是

location /api/ {
proxy_pass http://backend;
}

如果你访问 http://abc.xyz/api/endpoint,你会被引导到 http://backend/api/endpoint;

如果配置是

location /api/ {
proxy_pass http://backend/;
}

如果你访问 http://abc.xyz/api/endpoint,你会被引导到 http://backend/endpoint.

这就是区别。

有关详情,请参阅: Nginx 反向代理返回404

请检查是否从 site-enabled文件夹中删除了 default.conf文件。 如果你在基于 debian 的 ubuntu 系统中,运行这个命令

sudo rm /etc/nginx/sites-enabled/default

这招对我很管用。

试着一步一步地排除故障,找出可能导致问题的因素。以下是一些可能的错误:

Nginx 配置发生了变化,但是 Nginx 没有重新加载它

这可能发生在重写 nginx.conf文件但没有触发 nginx 重新加载配置时。码头用户可能经常遇到这种情况。
要重新加载 Nginx 配置,在 Nginx 主机上执行命令: nginx -s reload
与码头: docker exec <container_name> nginx -s reload
参考文献: < a href = “ https://docs.NGINX.com/NGINX/admin-guide/basic-function/running-control/”rel = “ nofollow noReferrer”> 在运行时控制 NGINX 进程

Nginx 默认配置正在覆盖您的

如果 nginx.conf也包含默认的 Nginx 配置,并且它意外地覆盖了您的配置,请仔细检查 nginx.conf是否包含任何默认的配置路径,就可能发生这种情况。
例如: include /etc/nginx/conf.d/*.conf;,它还将在以下地址加载 nginx 默认配置
enter image description here
如果是这种情况,从 nginx.conf文件中注释掉(或删除)这个 include配置语句。

验证 Nginx 配置

使用命令 nginx -T验证应用的实际配置,这将触发 Nginx 测试并打印配置,检查配置输出是否与预期结果匹配:
参考文献: Nginx 命令行
您应该会看到如下内容

root@22a2e5de75ba:/etc/nginx/conf.d# nginx -T
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
user  nginx;
worker_processes  auto;


error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;




events {
worker_connections  1024;
}


http {
server {
server_name "localhost";
listen 80;
location /todo_server/ {
proxy_pass http://jsonplaceholder.typicode.com;
}
}
#
    

include       /etc/nginx/mime.types;
# default_type  application/octet-stream;
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log  /var/log/nginx/access.log  main;
sendfile        on;
#tcp_nopush     on;
keepalive_timeout  65;
#gzip  on;
# include /etc/nginx/conf.d/*.conf;
}

Nginx proxy_pass配置的问题

与此线程中的前一个答案类似
如果在 URI 末尾指定尾部斜杠 /,这将导致意外的代理映射。
首先,查看完整的: < a href = “ http://Nginx.org/en/docs/http/ngx _ http _ xy _ module.html # xy _ pass”rel = “ nofollow norefrer”> Nginx xy _ pass document
我将使用来自 Json 占位符的 API http://jsonplaceholder.typicode.com/todos/进行演示(它实际上为您提供了测试响应)

跟着斜线
末尾的斜杠表示这个 proxy_pass指令是用 URI 指定的。在这种情况下,当请求传递到服务器时,与位置匹配的规范化请求 URI 的一部分将被指令中指定的 URI 替换。

示例 : 使用以下配置(可以理解为通过 URI 指定)将生成此映射

location /path1/ {
proxy_pass http://jsonplaceholder.typicode.com/todos/;
# Requesting http://localhost:8080/path1/ will proxy to => http://jsonplaceholder.typicode.com/todos/
# Requesting http://localhost:8080/path1/1/ will proxy to => http://jsonplaceholder.typicode.com/todos/1
}


location /path2/ {
proxy_pass http://jsonplaceholder.typicode.com/;
# Requesting http://localhost:8080/path2/todos/ will proxy to => http://jsonplaceholder.typicode.com/todos/
}

没有尾随斜杠
如果没有后面的斜杠 /,它就被理解为没有 URI 模式,请求 URI 在处理原始请求时以与客户机发送的相同的形式传递给服务器,或者在处理更改后的 URI 时传递完整的规范化请求 URI。

location /todos/ {
proxy_pass http://jsonplaceholder.typicode.com;
# Requesting : http://localhost:8080/todos/ will proxy to ==> http://jsonplaceholder.typicode.com/todos/
# Requesting : http://localhost:8080/todos/1 will proxy to ==> http://jsonplaceholder.typicode.com/todos/1
}

也请参阅来自@dayo 的 完整的答案 也是理查德 · 史密斯(Richard Smith)的回答