NginX 重写和绝对资源路径

NginX 重写和绝对资源路径

在我的域名上,我有一个用于 Meteor 应用程序的子域名,比如说

http://meteor.example.com/

在此之下,我想放置单独的应用程序,每个应用程序都有一个 URI。假设 Metrace 应用程序聊天应该有这个 URL:

http://meteor.example.com/chat/

这是我的配置:

location ~ /chat/(.*) {
        proxy_pass http://127.0.0.1:4000/$1;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr;

        if ($uri != /snake_meteor/) {
                expires 30d;
        }
}

我跟着本指南来配置它。

现在,这部分工作正常。它确实将请求传递给应用程序,并返回页面的正确 HTML,但随后问题就开始了。返回的 HTML 引用了资源文件,如 JS、CSS 和图像。不幸的是,HTML 中的引用在表单上

<script src="/somescript.js"></script>

因此它请求

http://meteor.example.com/somescript.js

绝对路径...

在应用程序中更改它们实际上不是一个选择。将资源放在域的根目录上也不是一种选择。

我可以在 NginX 配置中做些什么来使其正常工作?还是我必须以其他方式执行此操作,例如另一级子域?


编辑:我的一个朋友建议检查 referer 标头。它部分有效。一些文件已获取,但建立 websocket 和其他一些操作失败。

我为此添加的配置是

location / {
        if ($http_referer ~ /chat/) {
                rewrite ^(.*) /chat/$1 permanent;
        }
}

这是可以接受的做法吗?我确信可以以某种方式重写配置的这一部分,以考虑同一域上的其他 Meteor 应用程序,但我不是 NginX 配置方面的专家。能帮点忙吗?

答案1

不幸的是,唯一合理的解决方案是修复应用程序,使其生成正确的 URL。所有其他解决方案都会导致细微的问题。

相关内容