Node.js Nginx配置SPA

Node.js Nginx配置SPA,node.js,nginx,single-page-application,Node.js,Nginx,Single Page Application,我需要一些关于SPA的nginx配置的帮助。我是用谷歌搜索到的碎片制作的,但我不明白它是如何工作的 我需要的是: 1) 提供静态文件 location ~ \.(css|js|svg|woff|woff2|ico|ttf|eot|jpe?g|png|txt)$ { try_files $uri $uri/ =404; expires 1y; add_header Cache-Control "public"; } 如果找不到文件,我返回404。如果我只是在UR

我需要一些关于SPA的nginx配置的帮助。我是用谷歌搜索到的碎片制作的,但我不明白它是如何工作的

我需要的是:

1) 提供静态文件

location ~ \.(css|js|svg|woff|woff2|ico|ttf|eot|jpe?g|png|txt)$ {          
  try_files $uri $uri/ =404;
  expires 1y;
  add_header Cache-Control "public"; 
}
如果找不到文件,我返回404。如果我只是在URL中键入不正确的文件名,这没关系,但是如果我在index.html而不是404页面中键入不正确的文件名,我会得到一个空白页面。应该是这样吗

2) 对/api的请求需要重定向到节点后端

location /api {
  try_files '' @proxy;
}

location @proxy  {
  proxy_pass http://localhost:3000;
}
我不太确定这条线是不是应该这样

try_files '' @proxy;
3) 最大的问题是,不匹配的请求需要返回index.html

location / {
  try_files '' /index.html;
  expires -1;
}

location = /index.html {
  expires -1;
}
据我所知,第一个块将所有未知请求重定向到index.html,但我不知道第二个块如何服务于这个index.html。我不是为了提供这个文件而写的,没有try\u files指令

1) 提供静态文件

你的解决方案很好。仅当您需要为这些URI设置不同的缓存控制和到期头时才需要它。
try\u files
语句是不必要的,因为这与默认行为相同

2) 对/api的请求需要重定向到节点后端

location /api {
  try_files '' @proxy;
}

location @proxy  {
  proxy_pass http://localhost:3000;
}
您的解决方案可以简化为:

location /api {
    proxy_pass http://localhost:3000;
}
这将处理以
/api
开头的任何URI,除非它与步骤(1)中的正则表达式匹配。您可以通过使用
^ ~
操作符来避免这种情况。有关详细信息,请参阅

3) 最大的问题是,不匹配的请求需要返回index.html

location / {
  try_files '' /index.html;
  expires -1;
}

location = /index.html {
  expires -1;
}
这通常实施为:

location / {
    try_files $uri $uri/ /index.html;
    ...
}
除非请求与任何其他
位置
、文件或目录匹配,否则URI将在内部重写为
/index.html
。有关详细信息,请参阅

1) 提供静态文件

你的解决方案很好。仅当您需要为这些URI设置不同的缓存控制和到期头时才需要它。
try\u files
语句是不必要的,因为这与默认行为相同

2) 对/api的请求需要重定向到节点后端

location /api {
  try_files '' @proxy;
}

location @proxy  {
  proxy_pass http://localhost:3000;
}
您的解决方案可以简化为:

location /api {
    proxy_pass http://localhost:3000;
}
这将处理以
/api
开头的任何URI,除非它与步骤(1)中的正则表达式匹配。您可以通过使用
^ ~
操作符来避免这种情况。有关详细信息,请参阅

3) 最大的问题是,不匹配的请求需要返回index.html

location / {
  try_files '' /index.html;
  expires -1;
}

location = /index.html {
  expires -1;
}
这通常实施为:

location / {
    try_files $uri $uri/ /index.html;
    ...
}

除非请求与任何其他
位置
、文件或目录匹配,否则URI将在内部重写为
/index.html
。有关详细信息,请参阅。

1)静态文件,如果找不到静态文件,我想重定向到我的应用程序的404页面,该怎么办?2) 我需要在几个地方请求api,所以我希望通过变量来解决它,而不是多次复制同一块。我现在做的对吗?3) 对于index.html,如果我知道我需要index.html而不是这个路径上的其他东西,我不太明白为什么我需要在文件中按$uri搜索?如果你想要自定义404处理程序,你可以使用
error\u page
try\u files
。使用
include
语句或正则表达式避免代码重复。如果你真的想让其他的东西都转到
index.html
使用
试试文件/index.html=404(404从未到达)。1)静态文件,如果找不到静态文件,我想重定向到我的应用程序的404页面怎么办?2) 我需要在几个地方请求api,所以我希望通过变量来解决它,而不是多次复制同一块。我现在做的对吗?3) 对于index.html,如果我知道我需要index.html而不是这个路径上的其他东西,我不太明白为什么我需要在文件中按$uri搜索?如果你想要自定义404处理程序,你可以使用
error\u page
try\u files
。使用
include
语句或正则表达式避免代码重复。如果你真的想让其他的东西都转到
index.html
使用
试试文件/index.html=404(从未到达404)。