如何配置Nginx为所有匹配模式的位置始终提供一个静态文件?
我有一个通过nginx提供服务的laravel应用程序,另一个应用程序只使用react创建一个静态站点,该站点只使用客户端路由react路由器 到目前为止还不错,现在我想实现以下目标: 所有带有模式的URL domain.com/admin/[whateverhere]应提供以下静态html文件如何配置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
/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。非常感谢,这是一个很好的解决方案