脚本的代码放在 Google Code 上, CSS 和 JS 均直接调用 SVN 主干文件. 改写脚本的时候发现 IE6 以外的浏览器不能正常执行, 比如: 页面直接显示成代码, JavaScript 不执行, 且获得浏览器警告信息如下.
Resource interpreted as Script but transferred with MIME type text/plain
经过排查, 发现是 SVN 的 MIME 设置问题. Firefox, Chrome, IE9 等现代浏览器会通过判断获取文件的 MIME 类型, 调用不同的客户端程序或使用不同的方式来执行. 如果文件的 MIME 缺失或者有误, 那浏览器会按默认方式处理. 而老版本的 IE 浏览器会识别文件类型并更具识别到的类型来处理, 所以一般不存在执行问题.
为了 SVN 服务器上的文件也被正确执行, 需要修改 svn:mime-type
.
手动设置
TortoiseSVN 和 Eclipse 等一类客户端可以对文件的属性进行设定. 以下是 TortoiseSVN 中的修改方式.
- 右击展开文件菜单, 选择 TortoiseSVN > Propertise.
- 添加或者修改 Mime-Type.
- 保存并提交 SVN.
在 Eclipse 中修改方法差不多, 文件的 SVN 属性的目录位置在 Team > Set Property.
自动匹配
SVN 有配置文件, 可以在里面进行配置.
- 打开 SVN 配置文件.
- Linux: /etc/subversion/config
- Windows: %APPDATA%\Subversion\config
- 设置
enable-auto-props = yes
- .
- 找到
auto-props
- 区域, 并添加文件的 mime-type. *.js = svn:mime-type=text/javascript *.css = svn:mime-type=text/css *.html = svn:mime-type=text/html
修改保存后, 新建对应后缀的文件, 提交时自动会带上设置的 mime-type.
后话
长久以来, SVN 对我来说只是一个代码管理工具, 会通过 Apache 或者 Nginx 等 Web 服务器来获取文件, 所以头一次遇到觉得诡异. 刚发现问题的时候没有去抓包, 还以为是 Google Code 的问题, 真是错怪它了. 事实上, Web 服务器提供一个 MIME 模块, 用来识别文件的 MIME, SVN 也一样. 只是 Apache 等默认打开了 MIME 自动匹配, 而 Subversion 没有.