我创建了一个新的 rails3 项目,但我在服务器日志中多次看到以下日志。为什么我会收到这些请求,我该如何避免这些请求?
在 2012-09-18 20:03:53 +0530 ActionController::RoutingError 开始 GET "/apple-touch-icon-precomposed.png" for 192.168.6.2 (No route matches [GET] "/apple-touch-icon- precomposed.png"):
我没有在任何地方给出这个链接,也不想在任何地方渲染这个图像。我不知道为什么要尝试加载此资源。
如果设备所有者将站点添加到其中,我猜苹果设备会发出这些请求。这相当于网站图标。解决方法是添加2个100×100的png文件,分别保存为apple-touch-icon-precomposed.png和apple-touch-icon.png,上传到服务器根目录。之后,错误应该消失了。
我注意到日志中有很多对 apple-touch-icon-precomposed.png 和 apple-touch-icon.png 的请求,这些请求试图从站点的根目录加载图像。我最初认为这是移动主题和插件的错误配置,但后来发现如果设备所有者将站点添加到 Apple 设备会发出这些请求。
来源:Why Webmasters Should Analyze Their 404 Error Log (Mar 2012; by Martin Brinkmann)
如果用户从 Safari Web 浏览器(Apple 设备)访问您的站点。如果未在 <head>
中按以下顺序定义站点图标,浏览器会尝试获取该图标:
apple-touch-icon-57x57-precomposed.png apple-touch-icon-57x57.png apple-touch-icon-precomposed.png apple-touch-icon.png
要解决此问题,请为 Safari Web 浏览器或 Apple 设备定义图标。将这样的内容添加到您网站的 head 部分:
<link rel="apple-touch-icon" href="/custom_icon.png"/>
如果您想保持 <head>
干净,请使用正确的名称将图标上传到站点的根目录。
默认图标大小为 57px。
您可以在 iOS developer library 上找到更多详细信息。
如果您在此处结束谷歌搜索,这是一个简单的配置,可防止此错误填满 Web 服务器日志:
阿帕奇虚拟主机
Redirect 404 /apple-touch-icon-precomposed.png
<Location /apple-touch-icon-precomposed.png>
ErrorDocument 404 "apple-touch-icon-precomposed does not exist"
</Location>
Nginx 服务器块:
location =/apple-touch-icon-precomposed.png {
log_not_found off;
access_log off;
}
PS:您是否也想添加 apple-touch-icon.png
和 favicon.ico
。
如果您不关心在各种 Apple 设备上看起来漂亮的图标,只需添加
get '/:apple_touch_icon' => redirect('/icon.png'), constraints: { apple_touch_icon: /apple-touch-icon(-\d+x\d+)?(-precomposed)?\.png/ }
到您的 config/routes.rb
文件和一些 icon.png
到您的 public
目录。重定向到 404.html
而不是 icon.png
也可以。
请注意,即使用户没有将网站添加到他们的 iOS 主屏幕上,也会发生这种情况 - 例如,每当您使用 iOS 版 Chrome 打开页面时,它都会执行 GET "/apple-touch-icon-precomposed.png"
。
我已经在我的 ApplicationController 中处理了这个和其他非 HTML 404 请求,如下所示:
respond_to do |format|
format.html { render :template => "error_404", :layout => "errors", :status => 404 }
format.all { render :nothing => true, :status => 404 }
end
format.all
响应会处理此 PNG 文件(我的网站不存在该文件)等图像。
我终于解决了!!这是 Mac 设备上的 Web Clip 功能。如果用户想在 Dock o Desktop 中添加您的网站,它会请求此图标。
You may want users to be able to add your web application
or webpage link to the Home screen. These links, represented
by an icon, are called Web Clips. Follow these simple steps
to specify an icon to represent your web application or webpage
on iOS.
如何解决?:添加一个图标来解决问题。
如果您像我一样不想将这些文件添加到您的 Rails 应用程序中,那么有一个像 quiet_assets 这样的 gem 会在您的日志中消除这些错误:
https://github.com/davidcelis/quiet_safari
另一种解决方案是简单地将路由添加到您的 routes.rb
它基本上捕获了 Apple 请求并将 404 呈现给客户端。这样您的日志文件就不会杂乱无章。
# routes.rb at the near-end
match '/:png', via: :get, controller: 'application', action: 'apple_touch_not_found', png: /apple-touch-icon.*\.png/
然后将方法“apple_touch_not_found”添加到您的 application_controller.rb
# application_controller.rb
def apple_touch_not_found
render plain: 'apple-touch icons not found', status: 404
end
同样的事情也发生在我身上。是的,正如@Joao Leme 所说,这似乎与用户将网站添加到其设备主屏幕的书签有关。
但是,我注意到即使日志中有错误,它也在幕后发生,用户永远不会看到错误。我假设设备请求特定于其分辨率的触摸图标(不存在),直到默认为一般 apple-touch-icon
或 apple-touch-icon-precomposed
(如果存在),否则会生成当前页面的小屏幕截图。
FWIW,将图标放在 /public 目录中。
只需创建称为适当名称的零大小文件。
该请求将得到满足,无需额外的数据传输或更多的日志记录行。
尝试更改链接
/apple-touch-icon-precomposed.png
至:
<%=asset_path "apple-touch-icon-precomposed.png" %>
apple-touch-icon-precomposed
。我认为这个链接包含在布局模板中,但我不是舒尔。