Rails url_helper 踩坑,url 里指定 host 自动加了本地端口

tinyfeng · 2018年03月26日 · 最后由 tinyfeng 回复于 2018年03月27日 · 1625 次阅读

这是我在routes里定义的一个路由:

get 'hello', to: 'hello#hello'

在rails console下进行如下操作:

Rails.application.routes.url_helpers.hello_hello_url host: 'http://abc.xyz'
=> "http://abc.xyz/hello"

而我在本地启动一个server,rails s -p 3333

在controller里用了这个东西: hello_hello_url host: 'http://abc.xyz'

返回值是"http://abc.xyz:3333/hello",里面居然自己加了本地端口!

有没有方法能够把自动加的3333端口给禁掉

我知道手动添加port可以一定程度上解决这个问题:

hello_hello_url host: 'http://abc.xyz', port: 80 # => "http://abc.xyz/hello"

可是这时候以https来访问,显然会出错

共收到 10 条回复

这不是坑吧,又不是外链,不用加host。

adamshen 回复

在一些情况下需要手动指定host,正常情况谁会那么折腾。。。

当然我也知道字符串拼接能实现我想要的url,但是我想尝试使用rails自带的method

tinyfeng 回复

并不是rails非要给你加上端口号,而是host、port、protocol三个参数,如果你没有指定,就会使用你请求里的值作为默认值。你是用3333这个端口去请求页面的,所以默认的port值就是3333,这个问题你部署以后就不存在了。https也一样,你用https协议请求的,生成的url也是https的。一般来说,使用url_helper生成的链接都是内链,所以这种机制是OK的,并不是坑。

adamshen 回复

你说的我同意,不过有时候在本地dev环境下的页面,引入一个production环境地址,通过这种方式生成,然后自动在host后加3333端口,导致bug。。。

部署出去是ok的,这个没有争议。

tinyfeng 回复

在本地dev环境下的页面,引入一个production环境地址

什么场景需要?

你怎么访问这个网址的,如果访问页面的时候就是带端口的,URL Helper 貌似会读请求头里的 Port 信息来构造 URL

7楼 已删除
jasl 回复

通过nginx,域名映射到localhost:3333

adamshen 回复

某些情况下,内网地址不可用,需要引用外网的地址,你懂的~

nginx 配置加上这个 proxy_set_header Host $http_host; 即可以了

moioo 回复

location里加上,好了, 完美解决问题,给你献上666~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册