我在这个 NGINX 配置文件中犯了什么错误?

我在这个 NGINX 配置文件中犯了什么错误?

我不会显示整个文件。除了 /client 位置的处理外,此文件中的所有内容均正常,我对此进行了如下设置:

location / {
     # First attempt to serve request as file, then
     # as directory, then fall back to displaying a 404.
     try_files $uri $uri/ =404;
}

location /client {
     alias /var/www/client/dist;
     try_files $uri $uri/ /var/www/client/dist/index.html =404;
}

我正在从目录中提供一个 php 应用程序/var/www/server。它目前正常运行。

/var/www/client目录中,我创建了一个 Angular2 应用程序。该命令ng build --prod --base-href=/client/构建应用程序并将其存储在文件夹中/var/www/client/dist/,该文件夹中的索引文件位于/var/www/client/dist/index.html

如果文件存在于 ,则请求/var/www/client/dist/real_file_path.ext应发送到http://host/client/real_file_path.ext,如果文件不存在 ,则请求http://host/client/non-existant/directory应发送到/var/www/client/dist/index.html应用程序解析 URL 以路由视图和控制器的位置。

日志显示别名成功将请求从/client重定向到/client/dist,但它服务404于 而不是/var/www/client/dist/index.html

什么原因导致失败?

我显然不了解有关别名或try_files的某些内容。

我曾尝试使用:

try_files $uri $uri/ /client/dist/index.html =404;

这也没有解决问题。

每次更改后,我都会运行sudo nginx -s reload。每次更改后,我都会验证 php 应用程序的性能。

答案1

感谢@Tim 和@Alexey Ten。

当我看到主帖中 Alexey Ten 的评论时,我确信这就是答案,因此我将其改为try_files $uri $uri/ /client/index.html =404;,但这并没有解决问题。

我遇到了空访问日志的问题,由于我的错误日志中有很多日志,所以我之前忽略了这个问题,但是为了收集更多信息来更新 Tim 建议的问题,我了解到我之前更改了访问日志的位置和格式。

log_format extlog '$request_time - $status - local time: $time_local; root: $document_root; uri: $document_uri; host: $host; hostname: $hostname; realpath root: $realpath_root; client address: $remote_addr; client port: $remote_port; request filename: $request_filename; method: $request_method; request_uri: $request_uri; scheme: $scheme; server_name: $server_name; server_port: $server_port; server_protocol: $server_protocol; response status: $status; uri: $uri';
access_log /var/log/nginx/long_log.log extlog;

该日志格式基本上是可用变量的数据转储。

当我尝试复制日志时我注意到了这一点:

0.000 - 200 - local time: 08/Jun/2018:09:19:08 -0700; root: /var/www; uri: /server/Core/js/autocomplete.js; host: sandbox.pediatricheartcenter.org; hostname: sandbox; realpath root: /var/www; client address: 192.168.76.37; client port: 54947; request filename: /var/www/server/Core/js/autocomplete.js; method: GET; request_uri: /server/Core/js/autocomplete.js; scheme: http; server_name: sandbox.pediatricheartcenter.org; server_port: 80; server_protocol: HTTP/1.1; response status: 200; uri: /server/Core/js/autocomplete.js
0.000 - 404 - local time: 08/Jun/2018:09:17:29 -0700; root: /var/www/client/dist; uri: /client/visit/5990653da56b4075bff360efcc52383f20171208090130; host: sandbox.pediatricheartcenter.org; hostname: sandbox; realpath root: /var/www/client/dist; client address: 192.168.76.37; client port: 54706; request filename: /var/www/client/dist/visit/5990653da56b4075bff360efcc52383f20171208090130; method: GET; request_uri: /client/visit/5990653da56b4075bff360efcc52383f20171208090130; scheme: http; server_name: sandbox.pediatricheartcenter.org; server_port: 80; server_protocol: HTTP/1.1; response status: 404; uri: /client/visit/5990653da56b4075bff360efcc52383f20171208090130

具体来说,两个请求的根不同。这意味着alias改变根对于 /client 位置中的请求,因此我的参考需要相对于这个新的根。

我将 try_files 更改为引用/index.html,现在它可以工作了!

我的最终位置块显示如下:

location /client {
    alias /var/www/client/dist;
    try_files $uri $uri/ /index.html =404;
}

相关内容