ChatGPT解决这个技术问题 Extra ChatGPT

在rails中使用路由时_url和_path有什么区别

当我们在 routes.rb 中使用 map.some_link 之类的名称定义路由时。我们可以通过两种方式使用链接 - some_link_urlsome_link_path

两者有什么区别?

使用哪个更安全?


m
modulitos

我有同样的问题,我写了 a small post about this in my blog

原因总结在这里(我在论坛上找到的):

*_path 用于视图,因为 ahref 隐式链接到当前 URL。所以一遍又一遍地重复它会浪费字节。但是,在控制器中,redirect_to 需要 *_url,因为 HTTP 规范要求 3xx 重定向中的 Location: 标头是完整的 URL。

Here is another explanation 这表示这取决于我们在从非 SSL 站点链接到 SSL 站点时是否需要使用绝对 URI,反之亦然。

到目前为止,我所阅读的内容并不表明它们中的任何一个都比另一个更安全。这真的归结为“正确”的用法。


非常感谢。发现它很有用。所以在控制器中我们使用“_url”,而在视图中我们可以使用“_path”,尽管“_url”仍然可以在那里使用。
您不需要将 *_url 用于控制器,路径也可以正常工作。仅在显示到外部来源的路线时才应使用 _url
进一步澄清:_path 输出同样适用于重定向中的 Location 标头。浏览器会将其解释为相对于根的重定向。
答案中的引用不正确。 _path 在控制器中工作。
您博客文章的 URL 是 404'ing。你能更新链接吗?
p
ponzao

path 是相对的,而 url 是绝对的。


比较简洁。我喜欢简洁。 ;) +1
完美的。在控制器(服务器端)中需要使用 _url,并且在视图(浏览器端)中使用 _path。
简明扼要的答案+1
C
Community

名为“用户”的资源的差异示例:

users_url # => http://localhost:3000/users
users_path  # => /users

I
Ian Lotinsky

与 Petros 的答案相同,除了 modern browsers handle relative redirects just fine。 (我会评论他的回答,但我还不能。)


A
Alok Swain

如果您的意思是不公开所有传递的数据,则通过安全,那么 _path 会更好,因为它会生成一个相对 url,类似于 '/login' 但 _path 会给出 'http://localhost:3000/login'。请参阅我在某个时候发现的有关相同内容的这篇博客文章。 When _url is better than _path


恐怕这是不正确的。出于安全原因使用 _path 不会提供任何安全性。这相当于说 Web 服务器的 IP 地址应该保密,当一个简单的 DNS 请求显示此信息时。
同样,上面给出的关于为了安全而隐藏主机和端口“localhost:3000”的示例是不正确的。使用广泛可用的软件网络扫描工具发现这些信息很简单。
R
Radhika

_url 将给出整个路径。由于它包含域名和协议,因此您可以将其用于例如。发送电子邮件或重定向到另一个域等。

_path 将返回 '/' 之后没有域、协议等的路径。所以你可以不时使用它(我猜),你不需要域的详细信息。


j
jbk

_url 帮助程序生成一个包含整个 URL 的字符串,而 _path 帮助程序生成一个包含从应用程序根开始的相对路径的字符串,例如:

photos_url  # => "http://www.example.com/photos"
photos_path # => "/photos"

根据 Rails Guides - Routing