我正在尝试在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'});
...
答案 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