【问题标题】:react router relative path to static files not loading correctly反应路由器相对路径到静态文件未正确加载
【发布时间】:2018-12-13 17:31:04
【问题描述】:

我有一个反应应用程序(简单的前端应用程序),它在生产中位于相对路径上(例如 suite.app.com/auth)。其他应用程序在不同的路径上。因此,我需要将此应用程序的所有静态文件请求通过 nginx 路由到 /auth。从 nginx 的角度来看,这基本上可以正常工作,但从反应的角度来看,我需要路径是相对的:

在我的 package.json 中,我添加了 "homepage": "./",

在我的 index.html 中我添加了<base href="/auth/">

所以现在当我加载文件时,我可以在浏览器的网络选项卡中看到

这是我所期望的。静态文件相对。但是,当我加载应用程序时,在我的服务器日志中,我可以看到这种情况:

something 没有将请求传递到正确的路径。 (FWIW 他们在那里返回 200 个的原因是因为根目录上有一个不同的应用程序,所以它实际上加载了其他应用程序文件,而不是这个。

任何关于这里可能发生的事情的提示都会很棒。

编辑:发布两个端点的 Nginx 配置。

server {
    listen 80;
    server_name app.site.com;
    add_header 'Referrer-Policy' 'origin';
    location /auth {
        proxy_pass http://authentication.internal.app/;
        proxy_set_header Host authentication.internal.app;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP $proxy_protocol_addr;
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
    }
    location / {
        proxy_pass http://dashboard.internal.app/;
        proxy_set_header Host dashboard.internal.app;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP $proxy_protocol_addr;
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
    }
}

【问题讨论】:

标签: javascript reactjs url react-router relative-path


【解决方案1】:

当您指定 proxy_pass 指令时,如果您在基本 URL 的末尾附加任何内容,Nginx 会将与您的位置块匹配的原始客户端请求 URL 的部分替换为您添加到 proxy_pass URL 的任何内容.

所以在你的情况下,你有location /auth,然后是proxy_pass http://authentication.internal.app/,后面有一个非常重要的斜杠

因此,对example.com/auth/static/style.css 的客户端请求与位置块/auth 匹配,Nginx 删除/auth 并将其替换为/,现在您的代理正在获取proxy.server//static/style.css

如果您删除斜线以将您的 proxy_pass 指令更改为 proxy_pass http://authentication.internal.app,则整个客户端请求 URL 将被传递给代理,因此上述请求将被代理到 proxy.server/auth/static/style.css。对于相反的效果,保留proxy_pass 的值不变并将位置块更改为location /auth/,Nginx 现在会将/auth/ 替换为/,代理请求将变为proxy.server/static/style.css

纯粹为了可读性,我会在你的配置文件中交换你的位置指令的顺序,以便第一个条目是location /

一种常见的误解是,Nginx 按列出的顺序评估位置指令并选择第一个匹配项,但这仅适用于由正则表达式定义的位置。

无论列出的顺序如何,都会评估所有前缀匹配,Nginx 会选择最长匹配的前缀位置。现在针对所有包含正则表达式的位置块评估请求,这部分确实按照它们列出的顺序发生,如果它们中的任何一个匹配 Nginx 将立即忘记最长前缀位置并将请求传递到匹配的正则表达式位置。如果没有匹配,则最佳前缀匹配将处理请求。

您可以通过在位置前添加^~ 修饰符来阻止 Nginx 搜索匹配某个前缀位置的请求的正则表达式匹配。

显然,您当前的配置中没有正则表达式位置,因此其中很多内容现在都不相关,但如果您稍后沿着这条路线走,它并不完全直观,所以也许它会在某些时候有所帮助。

【讨论】:

  • 谢谢,所以当我将位置设置为/auth/时它工作了
猜你喜欢
  • 2018-01-03
  • 2019-08-03
  • 2021-04-27
  • 2023-03-03
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
相关资源
最近更新 更多