我不会显示整个文件。除了 /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;
}