我正在编写一个Rails Web应用程序,向用户显示我们的机场数据。我提供的一个便利是该机场的FlightRadar24网站链接。
我为该机场构建了一个URL,例如"https://www.flightradar24.com/airport/JFK",然后显示一个正常的超链接:
<td align="center">
<%= link_to 'FR 24', airport.flight_radar_24_link, target: '_blank' %>
</td>
当我在 Heroku 上的生产服务器上单击链接时,这工作正常,但是当我在本地运行 Web 服务器时,我收到 HTTP 错误:
This page isn’t working
If the problem continues, contact the site owner.
HTTP ERROR 418`
我认为这与CSRF有关,但我找不到任何确定的东西。
源代码在 https://github.com/keithrbennett/our_airports,以防万一。
谁能告诉我发生了什么以及我该如何解决?
我不确定为什么 FlightRadar24 在这种情况下以418
响应,但它确实使在本地运行您的应用程序变得困难。
这是因为 HTTP 引用标头。当该标题设置为localhost
时,您将获得一个茶壶;如果没有,你会得到 200。
% curl -I --referer "http://localhost:3000" "https://www.flightradar24.com/airport/JFK"
HTTP/2 418
date: Mon, 03 Sep 2018 23:02:16 GMT
server: cloudflare
但以 example.com 为裁判:
% curl -I --referer "http://www.example.com" "https://www.flightradar24.com/airport/JFK"
HTTP/2 200
date: Mon, 03 Sep 2018 23:02:29 GMT
content-type: text/html; charset=utf-8
last-modified: Mon, 03 Sep 2018 23:02:29 GMT
x-airport: BQH
server: cloudflare
(为了便于阅读,删除了一些标题(
如何变通?
- 运行使用漂亮的主机名(如
our-airports.test
(的本地开发服务器。我为此使用 puma-dev,在本地运行多个 rails 应用程序时也很方便。 - 编辑
/etc/hosts
以获得漂亮的主机名,例如our-airports.test
编辑:
在这个答案中找到了一个更好的解决方案,就像将此元标记添加到您的 HTML 中一样简单:
<meta name="referrer" content="no-referrer" />
csexton 描述的不需要对代码或计算机设置进行任何更改的引荐来源网址问题的最简单解决方案是使用 lvh.me 而不是 localhost 在本地访问您的网站,如http://lvh.me:3000
所示。如果您删除这些行,然后访问http://lvh.me:3000/airports/212
,您将看到您可以毫无问题地访问 https://www.flightradar24.com/airport/JFK。
这是有效的,因为一位名叫Levi Cook的聪明开发人员注册了域 lvh.me 并将其及其所有子域设置为指向计算机上的localhost(127.0.0.1(。