希望你没有't need a non-standard port in your URLs, but if you did need to know it you' d它在你的应用程序状态,因为它是你在服务器启动时传递给 app.listen 的任何东西 . 但是,在非标准端口上进行本地开发的情况下,Chrome似乎在主机头中包含端口,因此 req.get('host') 返回 localhost:3000 . 因此,至少对于标准端口上的 生产环境 站点并直接浏览到您的快速应用程序(没有反向代理)的情况, host Headers 似乎对URL中的端口做了正确的事情 .
13 回答
我使用节点包'url'(npm install url)
它的作用是你打电话的时候
它将使您可以检索全部或部分网址 . 更多信息:https://github.com/defunctzombie/node-url
我以下面的方式使用它来获取在http://www.example.com/之后的任何内容,以用作变量并拉出特定的配置文件(有点像facebook:http://www.facebook.com/username)
虽然为了这个工作,你必须在server.js文件中以这种方式创建你的路由:
并以这种方式设置您的路由文件:
当Express behind proxies时,make req.host/req.hostname有效必须有两个条件:
在app.js中
app.set('trust proxy', 'loopback');
X-Forwarded-Host
标头必须由您自己在网络服务器中指定 . 例如 . apache,nginxnginx :
apache :
我的代码看起来像这样,
params['host_url'] = req.protocol + '://' + req.headers.host + req.url;
要么
我实际上发现通过使用下面的代码你可以得到你的网址 . 然后继续切片并决定下一步 .
您需要使用
req.headers.host + req.url
构造它 . 当然,如果你在不同的端口托管,这样你就会得到这个想法;-)使用url.format:
这支持所有协议并包括端口号 . 如果您的originalUrl中没有查询字符串,则可以使用此更干净的解决方案:
如果您有查询字符串:
这是添加可以在req对象上调用以获取url的函数的好方法
现在您有一个功能,您可以根据需要随时拨打电话 .
该协议可用作
req.protocol
. docs here在Express 3.0之前,您可以假设协议为
http
,除非您看到req.get('X-Forwarded-Protocol')
已设置且值为https
,在这种情况下您知道这是您的协议主持人来自
req.get('host')
,正如Gopal指出的那样希望你没有't need a non-standard port in your URLs, but if you did need to know it you' d它在你的应用程序状态,因为它是你在服务器启动时传递给
app.listen
的任何东西 . 但是,在非标准端口上进行本地开发的情况下,Chrome似乎在主机头中包含端口,因此req.get('host')
返回localhost:3000
. 因此,至少对于标准端口上的 生产环境 站点并直接浏览到您的快速应用程序(没有反向代理)的情况,host
Headers 似乎对URL中的端口做了正确的事情 .路径来自
req.originalUrl
(感谢@pgrassant) . 请注意,此DOES包含查询字符串 . docs here on req.url and req.originalUrl . 根据您打算对URL执行的操作,与req.url
相比,originalUrl
可能是也可能不是正确的值 .将这些组合在一起以重建绝对URL .
您可以改为使用the node.js API for URLs并传递
URL.format()
来自express的信息,而不是将这些事物连接在一起 .例:
我发现它有点像PITA来获取请求的URL . 我不敢相信快递没有更简单的方法 . 应该是req.requested_url
但这是我如何设置它:
用这个,
我建议使用originalUrl而不是URL:
在这里查看originalUrl的描述:http://expressjs.com/api.html#req.originalUrl
在我们的系统中,我们做这样的事情,所以originalUrl对我们很重要:
blah_controller看起来像这样:
所以我们的网址格式如下:
因此,我们需要bar控制器获取处理程序中的req.originalUrl .