如何配置Nginx为所有匹配模式的位置始终提供一个静态文件?

如何配置Nginx为所有匹配模式的位置始终提供一个静态文件?,nginx,react-router,Nginx,React Router,我有一个通过nginx提供服务的laravel应用程序,另一个应用程序只使用react创建一个静态站点,该站点只使用客户端路由react路由器 到目前为止还不错,现在我想实现以下目标: 所有带有模式的URL domain.com/admin/[whateverhere]应提供以下静态html文件 /var/www/html/admin\u app/public/index.html(react static admin app)而不是由 /var/www/html/users\u app/pub

我有一个通过nginx提供服务的laravel应用程序,另一个应用程序只使用react创建一个静态站点,该站点只使用客户端路由react路由器

到目前为止还不错,现在我想实现以下目标:

所有带有模式的URL domain.com/admin/[whateverhere]应提供以下静态html文件

/var/www/html/admin\u app/public/index.html
(react static admin app)而不是由

/var/www/html/users\u app/public/index.php
(laravel应用程序)

这是我的nginx配置,仅用于此部分,它不起作用,但返回404:

   location /admin/ {
      root /var/www/html/admin_app/public;
      index index.html;
      try_files $uri index.html;
    }
配置的其余部分只是ssl和主域

我不希望laravel应用程序处理/admin/projects/admin/users路由,但我希望所有这些都只转到index.htlm文件,该文件是一个静态react应用程序,仅用于客户端路由器

通过检查nginx的外观,我看到它试图读取不存在的html文件!不是我在/var/www/html/admin\u app/public/index.html中指定的

 2020/12/01 15:30:31 [error] 6#6: *8 open() "/etc/nginx/htmlindex.html" failed (2: No such file or directory),

我不知道nginx为什么要打开这个/etc/nginx/htmlindex.html文件…

有两种可能的解决方案

首先,使用正则表达式
location
root
try\u files
指令:

location ~ ^/admin(/.*)$ {
    root /var/www/html/admin_app/public;
    try_files $1 /index.html =404;
}
location ^~ /admin/ {
    alias /var/www/html/admin_app/public/;
    if (!-e $request_filename) { rewrite ^ /admin/index.html last; }
}
正则表达式
位置
是按顺序计算的,因此配置文件中的位置很重要。放置在
服务器
块的开头附近,以避免不必要的副作用。有关详细信息,请参阅

注意,
=404
从未到达,它只是存在于
/index.html
不是
try\u files
语句的最后一个参数。有关详细信息,请参阅


或者,使用前缀
location
alias
指令:

location ~ ^/admin(/.*)$ {
    root /var/www/html/admin_app/public;
    try_files $1 /index.html =404;
}
location ^~ /admin/ {
    alias /var/www/html/admin_app/public/;
    if (!-e $request_filename) { rewrite ^ /admin/index.html last; }
}
位置
值和
别名
值均应以
/
结尾,或两者均以
/
结尾


alias
try\u文件
指令由于以下原因不能很好地协同工作:
if
块。请参见
位置
块中的
if
的用法。

您的
/index.html
术语需要一个前导
/
,不能作为最终参数。使用:
try\u files/index.html=404太好了!这非常好,因为第一步所有人都在服务index.html。现在我遇到了第二个问题,那就是对于js、图像和其他文件,我需要为它们提供服务,而不是index.html。我怎么能用一条规则呢?现在发生的是,例如domain/admin/js/t.js返回index.html的内容。这个想法是index.html应该只为domain/admin/posts/33等路由返回,应该从真实文件内容返回文件是
/var/www/html/admin\u app/public
中的所有资源文件,并且使用以
/admin/
开头的URI访问这些文件?@RichardSmith是的,它们的请求就像
域/admin/static/js/main.js
一样
/var/www/html/admin\u app/public/static/js
/static/css等等,虽然index只是public/index.html和favicon以及其他内容,但index.html是如何请求网页块的:
https://domain.dev/admin/static/js/main.119be1ce.chunk.js
当前,index.html将返回所有内容,对于这个脚本resultPerfect,这几乎就是了!!!资产工作正常,索引工作正常所有路由非文件都转到index.html。问题是:类似于
domain/api/admin/approve posts
的URL仍然由这个位置块处理。我只需要像
domain/admin/*
这样的URL由该块处理,而在domain`/admin`之后没有直接链接的URL应该像以前一样由laravel应用程序处理,因为现在这些URL断开并返回404,例如现在
domain/api/admin/approve post
返回404由这个新的位置块处理,相反,我的答案中的
位置
块都不会匹配以
/api/admin/
开头的URI,而是应该像以前一样由laravel块处理。如果这些URI被重定向,则会发生在配置中的其他位置。我重新启动了代理,现在可以使用第二个变体正常工作,只使用别名匹配的内容,在域之后直接以/admin开头,以及所有其他内容,如/api/admin或laravel应用程序下一个位置处理的任何/admin。非常感谢,这是一个很好的解决方案