带有Apache反向代理的nextJS + ExpressJS在URL中导致“未定义”

时间:2020-03-31 20:58:50

标签: node.js apache express reverse-proxy next.js

我正在尝试在Apache上设置nextJS + ExpressJS网站。我有一个反向代理,它将任何请求转发到http://1.23.45.67(我的IP在端口80)到运行我的nodejs服务器的localhost:3000。当我在浏览器中打开网站时,一切看起来都很好。图片/ css加载正确,我可以在网站上浏览,但是每当向后端发出ajax请求(例如,通过api调用来注册用户)时,它都会使用请求网址http://1.23.45.67/undefined/api/v1/users/register来完成此操作。

我的虚拟主机apache配置看起来像

<VirtualHost *:80>
    ServerName www.myservername.com
    ServerAlias myservername.com
    DocumentRoot /var/www/myapp/html
    ErrorLog /var/www/myapp/log/error.log
    CustomLog /var/www/myapp/log/requests.log combined

    ProxyRequests on
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
</VirtualHost>

我正在使用.env文件中的基本url变量生成我的ajax请求url。 我还尝试过将http://localhost/http://localhost:3000/用作BASE_URL

# simplified .env file
...
BASE_URL=http://1.23.45.67/
...
# simplified register page where we make the ajax request.
...
fetch(`${process.env.BASE_URL}/api/v1/users/register`, {method: 'GET'});
...

1 个答案:

答案 0 :(得分:0)

对于任何偶然发现此问题的人... apache配置不是问题。问题是我如何在nextjs中使用dotenv。在我当前的项目中,nextjs在构建时而不是运行时获取.env变量。当我的github操作编译并将代码推送到服务器时,.env不存在,因此我在url中获得“未定义”。我相信NextJS的publicRuntimeConfig是解决方案。如果希望在运行时而不是构建时获取它们,则必须将前端使用的所有.env变量添加为publicRuntimeConfig变量。 https://nextjs.org/docs/api-reference/next.config.js/runtime-configuration