使用express res函数redirect(url)时,我被重定向到错误的url!
我的网站URL是mywebsite.com:
function myroute(app) {
app.get(/route, function(req, res) {
var url = getMyUrl();
console.log(url); // https://otherwebsite.com/foo?bar=baz [OK]
res.redirect(url); // redirect to https://mywebsite.com/foo?bar=baz [WRONG!]
});
}
我不知道为什么要使用良好的参数而不是otherwebsite.com来表示重定向到mywebsite.com
不知道为什么...
此错误在生产中发生。在我的开发环境中,重定向URL是好的URL。
预先感谢
编辑
我也尝试过:
res.location(url);
和
res.setHeader(302, {Location: url});
但是它总是重定向到错误的URL ... 我的url变量很好,但是我收到以下标头响应:
HTTP/1.1 302 Found
X-Powered-By: Express
Location: https://mywebsite.com/foo?bar=baz
Vary: Accept\r\nContent-Type: text/html; charset=UTF-8
Content-Length: 170
Date: Fri, 13 Jul 2018 21:52:18 GMT
Connection: keep-alive
编辑2
在这里进行更多测试:
res.redirect("https://www.google.fr/toto?key=value"); // https://mywebsite.com/toto?key=value **[fail]**
res.redirect("https://www.google.fr/toto"); // https://mywebsite.com/toto **[fail]**
res.redirect("https://www.google.fr"); // https://www.google.fr **[success]**
如果添加路径,它似乎无法重定向到我想要的域。有什么想法吗?
编辑3
可能是我的虚拟主机引起的吗?
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName mywebsite.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5001/
<Location />
ProxyPassReverse /
Order deny,allow
Allow from all
</Location>
SSLCertificateFile ...
SSLCertificateKeyFile ...
</VirtualHost>
</IfModule>
答案 0 :(得分:2)
我认为需要包括301。
尝试将res.redirect(url)
更改为res.status(301).redirect(url)
,看看是否可以解决问题。
答案 1 :(得分:2)
这次提供了一个实际的答案,因为我的上一个答案(理应如此)被删除了。
错误的URL重定向肯定是由以下原因引起的:
ProxyPassReverse /
该指令的作用是this:
“让Apache httpd调整HTTP重定向响应上Location,Content-Location和URI标头中的URL。”
就我而言,删除此指令会在应用程序中引起其他内部重定向问题,因此我试图寻找一种向其添加异常的方法。
但是,事实证明,如果我调整Express节点js配置的“ mountpath”以匹配代理服务器的路径,则不需要ProxyPassReverse(仅需要ProxyPass)。不知道这个答案是否可以为您提供实际的解决方案,但是它设法使用Apache作为反向代理在我的节点应用程序上解决了这个问题。