无法在 nginx 上设置子页面

无法在 nginx 上设置子页面

抱歉,如果这是一个容易解决的问题,但我对 nginx 还不太熟悉,并且已经尝试解决这个问题好几天了。

我的问题是,我想在 example.com/api 下显示一个自制的index.html,但无论我尝试什么,它总是显示 404 页面。

提供一些附加信息:
我运行一个在端口 2000 上运行的 API。我配置了 nginx,以更改 /api 下所有页面的端口。API
本身在 /api/* 下(在不同端点下)提供图像,并在 /api.json 下提供所有可用端点的 JSON 列表

这可能是由于端口不正常而导致的问题吗?

我把它放进index.htmlvar/www/html/api,甚至试图alias.conf(在location /api部分中)设置一个,但那也不起作用。

这是.conf当前设置的。请注意,除了/api与页面本身无关的位置之外,其他位置均与页面本身无关。这些是用于在主页上运行的仪表板,但我保留了它们,以防万一它确实会改变某些东西。

map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     max;
    ~image/                    max;
}

server {
    server_name example.com;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    index index.php;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    open_file_cache          max=2000 inactive=20s;
    open_file_cache_valid    60s;
    open_file_cache_min_uses 5;
    open_file_cache_errors   off;

    expires $expires;

    root /var/www/html;
    index index.html;

    #error_page 404 /;
    #error_page 403 /;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.php$ {
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    
$document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }
    location /vendor {
        deny all;
        return 404;
    }
    location /secret-key.txt {
        deny all;
        return 404;
    }

    location /api {
        proxy_pass http://127.0.0.1:2000;
        sendfile on;
    }
}

server {
    listen         443;
    server_name    www.example.com;
    return         301 https://example.com;

    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
}

server {
    listen 80;
    listen [::]:80;
    server_name _;
    return 301 https://example.com;
}

答案1

您需要在配置中使用以下位置块来提供静态.html文件:

location /api {
    try_files $uri @upstream;
}

location @upstream {
    proxy_pass 127.0.0.1:2000;
    sendfile on;
}

这告诉 nginx 首先尝试从 root/api 目录(/var/www/html/api在您的情况下)提供静态文件,如果没有找到,则尝试@upstream将请求发送到上游服务器的位置。

另一个选择是将静态 HTML 文件放在应用程序的根文件夹中(如果它可以提供文件服务)。

答案2

那么首先,您确定需要所有这些选项来提供 index.html 吗?

当您将某个内容通过 proxy_pass 传递到 127.0.0.1 时,意味着您会收到一个请求并将其传递给在该 ip:port 上运行的另一个服务。因此,如果您想为 index.html 提供服务,proxy_pass 选项将不起作用。此外,您还指定了根路径直到 /html 文件夹,并且您没有添加 api/ 文件夹。

无论如何,我建议从一个更简单的配置开始,例如下面的配置并在此基础上构建:

server {
  listen 80;
  server_name example;
  return 302 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  ssl on;
  ssl_certificate /etc/ssl/certs/foo.crt;
  ssl_certificate_key /etc/ssl/certs/bar.key;

  ssl_prefer_server_ciphers on;
  ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA     RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";

  server_name example.com;

  access_log /var/log/nginx/nginx.vhost.access.log;
  error_log /var/log/nginx/nginx.vhost.error.log;
  location / {
    try_files $uri $uri/ /index.html;
     include /etc/nginx/mime.types;
      root /home/test//test.html;
   }
  }

相关内容