为什么我得到apple-touch-icon-precompose。png错误

我已经创建了一个新的rails3项目,但我在我的服务器日志中多次看到以下日志。为什么我得到这些请求,我如何避免这些?

Started GET "/apple-touch-icon- prewritten .png" for 192.168.6.2 at 2012-09-18 20:03:53 +0530

ActionController::RoutingError (No route matches [GET]) “/ apple-touch-icon-precomposed.png”):< / p >

我没有在任何地方给出这个链接,也不想在任何地方渲染这个图像。我不知道为什么这个资源正在被尝试加载。

187177 次浏览

尝试改变链接从

/apple-touch-icon-precomposed.png

:

<%=asset_path "apple-touch-icon-precomposed.png" %>

我猜如果设备所有者将站点添加到苹果设备上,苹果设备就会发出这些请求。这相当于favicon。解决方法:添加2个100×100 png文件,分别保存为apple-touch-icon- precomposd .png和apple-touch-icon.png,上传到服务器根目录。在那之后,错误应该消失了。

我注意到在日志中有很多试图从站点根目录加载图像的apple-touch-icon- precomposen .png和apple-touch-icon.png请求。我一开始以为这是手机主题和插件的错误配置,但后来发现,如果设备所有者将站点添加到苹果设备上,苹果设备就会发出这些请求。

来源:为什么网站管理员应该分析他们的404错误日志(2012年3月;马丁·布林克曼)

同样的事情也发生在我身上。是的,正如@Joao Leme所说,这似乎与用户将一个网站书签到他们的设备主屏幕有关。

但是,我注意到,尽管日志中有错误,但它是在幕后发生的,用户从未看到错误。我假设设备对特定于其分辨率的触摸图标(它不存在)发出请求,直到默认为一般的apple-touch-iconapple-touch-icon-precomposed(如果存在),或者生成当前页面的一个小屏幕截图。

FWIW,把图标放在/public目录下。

请注意,即使用户没有将网站书签到他们的iOS主屏幕,这也会发生-例如,任何时候你使用Chrome for iOS打开一个页面,它都会执行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文件这样的图像(我的网站不存在)。

如果用户从Safari Web浏览器(Apple设备)访问您的站点。如果站点图标没有在<head>中定义,浏览器将按照以下顺序尝试获取该站点图标:

  1. apple-touch-icon-57x57-precomposed.png
  2. apple-touch-icon-57x57.png
  3. apple-touch-icon-precomposed.png
  4. apple-touch-icon.png

要解决此问题,请为safari web浏览器或apple设备定义一个图标。在你网站的标题部分添加如下内容:

<link rel="apple-touch-icon" href="/custom_icon.png"/>

如果你想保持<head>干净,然后用正确的名称将图标上传到你的站点根目录。

默认图标大小为57px

你可以在iOS开发者库上找到更多细节。

如果像我一样,你不想把这些文件添加到你的Rails应用程序中,那么有一个像quiet_assets这样的宝石可以在你的日志中屏蔽这些错误:

https://github.com/davidcelis/quiet_safari

我终于解决了!!它是Mac设备上的Web剪辑特性。如果一个用户想在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.

更多信息: https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html

<强>怎么解决?:

.添加图标解决问题

如果你在这里结束谷歌,这是一个简单的配置,以防止这个错误充满web服务器日志:

Apache虚拟主机

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.pngfavicon.ico

另一种解决方案是简单地添加到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/

然后在你的application_controller.rb中添加一个方法'apple_touch_not_found'

# application_controller.rb
def apple_touch_not_found
render  plain: 'apple-touch icons not found', status: 404
end

如果你不在乎图标在各种苹果设备上是否好看,那就添加

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也可以。

只需创建称为适当名称的零大小文件。

该请求将被满足,没有额外的数据传输或进一步的记录线路。