Random Tech Thoughts

The title above is not random

Safari 无法使用本地 PAC 文件的原因和解决办法

Mountain Lion 修改了 Safari 能访问的目录,所以下文的修复方法失效了。在 Mountain Lion 上还是通过 http 服务器来提供 pac 文件吧,具体参考我的新文章

最近网络环境非常糟糕,无法访问 Google 的情况越来越多。实验室的公用代理经常无法使用,不得不在本地写几个 PAC 文件备用。使用过程中发现用本地的 PAC 文件设定代理 Chrome, Firefox, Twitter For Mac 都能正常使用,唯独 Safari 不行。但是一旦本地开一个 web server 来获取这个文件就一切正常。

Google 一番得到结果,原因是 OS X Lion 的 sandbox 机制限制了 Safari 能够访问的文件,而我指定的 PAC 文件 Safari 没有权限读取。

很多程序的 sandbox configuration 文件位于 /usr/share/sandbox,这些文件限定了程序能够访问什么文件。例如这个目录下的 sshd.sb 文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
;; Copyright (c) 2008 Apple Inc.  All Rights reserved.
;;
;; sshd - profile for privilege separated children
;;
;; WARNING: The sandbox rules in this file currently constitute
;; Apple System Private Interface and are subject to change at any time and
;; without notice.
;;

(version 1)

(deny default)

(allow file-chroot)
(allow file-read-metadata (literal "/var"))

(allow sysctl-read)
(allow mach-per-user-lookup)
(allow mach-lookup
  (global-name "com.apple.system.notification_center")
  (global-name "com.apple.system.logger"))

有没有很惊讶?本来我只会发个推说下 PAC 文件会因为 sandbox 而无法使用,但是看到它的 configuration 使用 Scheme 来定义的时候决定写博客了。

Safari 的 sandbox configuration 位于 /System/Library/PrivateFrameworks/WebKit2.framework/WebProcess.app/Contents/Resources/com.apple.WebProcess.sb

知道 PAC 文件不能使用的原因后解决起来就方便了。修改配置文件当然可以,但是遇到 Safari 升级可能要重新修改。另一个简单点的办法是把 PAC 文件放到 Safari 可以访问的目录,例如 ~/Library/Internet\ Plug-Ins 目录

Comments