抱歉,如果这是一个容易解决的问题,但我对 nginx 还不太熟悉,并且已经尝试解决这个问题好几天了。
我的问题是,我想在 example.com/api 下显示一个自制的index.html
,但无论我尝试什么,它总是显示 404 页面。
提供一些附加信息:
我运行一个在端口 2000 上运行的 API。我配置了 nginx,以更改 /api 下所有页面的端口。API
本身在 /api/* 下(在不同端点下)提供图像,并在 /api.json 下提供所有可用端点的 JSON 列表
这可能是由于端口不正常而导致的问题吗?
我把它放进index.html
去var/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;
}
}