通过mod_rewrite,网站速度提高了5倍,但CSS图像被破坏了

时间:2009-03-11 11:06:51

标签: css .htaccess mod-rewrite image subdomain

我正在使用.htaccess来加速具有以下重定向的网站:

request for http://example.com/images/name.jpg  routed to  http://i.example.com/name.jpg
request for http://example.com/css/name.css     routed to  http://c.example.com/name.css

通过收听Stack Overflow播客,我了解到这可以使网站更快,因为浏览器可以同时下载更多文件(显然每个域有两个流,虽然这是未经证实的)。 / p>

事实上,差异是戏剧性的;页面加载快五倍

我没有触及原始文件夹和图片 - 我只是使用mod_rewrite将地址从 example.com/images / 更改为 i.example.com /

rewritecond %{HTTP_HOST}     !^i\.example\.com       [NC]
rewriterule ^images/([^/]+)$ http://i.example.com/$1 [L]
rewritecond %{HTTP_HOST}     !^c\.example\.com       [NC]
rewriterule ^css/([^/]+)$    http://c.example.com/$1 [L]

我遇到的问题是这种技术适用于html中包含的图像标签,但不适用于通过样式表包含的图像:

  

img src = / images / logo.jpg 效果很好

     

背景:网址(/ images/logo.jpg); 不起作用

服务器错误日志包含以下条目:

  

文件不存在:/ var / www / html / css / images,referer:http://example.com/page.html

这似乎意味着重写规则的应用不正确。

如果使用的话,样式表可以使用:

  

背景:网址(http://i.example.com/logo.jpg);

但是,为了避免重写所有样式表,我想知道:为什么url重写不像html img标签那样适用于样式表

[update1] Safari 4 Beta,Firefox 3.0.3和Chrome中存在此问题,但页面在IE6中运行良好

[update2] 添加[L,R = 301]和[L,R = 302]没有帮助。

[update3] 我根据Gumbo的建议尝试了以下内容:

如果路径与主机名不匹配,则从外部重定向:

rewritecond %{HTTP_HOST}     !^i\.domain\.com$
rewriterule ^images/([^/]+)$ http://i.domain.com/$1 [L,R=301]
rewritecond %{HTTP_HOST}     !^c\.domain\.com$
rewriterule ^css/([^/]+)$    http://c.domain.com/$1 [L,R=301]

内部重定向;如果有一个不必要的文件夹名称将其删除(请参阅上面的服务器错误):

rewritecond %{HTTP_HOST}     ^i\.domain\.com$
rewriterule ^images/([^/]+)$ $1 [L]
rewritecond %{HTTP_HOST}     ^c\.domain\.com$
rewriterule ^css/([^/]+)$    $1 [L]

它仍然无效。奇怪的是,服务器错误是:

  

文件不存在:/ var / www / html / css / var,referer:http://domain.com/page.html

2 个答案:

答案 0 :(得分:1)

我能够通过不尝试将目录合并到子域来解决这个问题:

request for domain.com/images/  routed to  i.domain.com/images/
request for domain.com/css/     routed to  c.domain.com/css/

效果很好,仍然非常快

在现代浏览器中似乎存在错误,其中重定向的css请求将仅应用新域,将原始目录保留为请求的一部分:

如果 url(domain.com/images/name.jpg)上的css图片重定向到 i.domain.com/name.jpg ,浏览器将会错误地请求 i.domain.com/images/name.jpg

答案 1 :(得分:1)

如果所有主机名使用相同的虚拟主机,我找到了解决此问题的方法:

# redirect externally if path doesn’t match host name
RewriteCond %{HTTP_HOST} !^i\.example\.com$
RewriteRule ^images/([^/]+)$ http://i.example.com/$1 [L,R=301]
RewriteCond %{HTTP_HOST} !^c\.example\.com$
RewriteRule ^css/([^/]+)$ http://c.example.com/$1 [L,R=301]

# redirect internally to the file
RewriteCond %{HTTP_HOST} ^i\.example\.com$
RewriteRule !^images/ images%{REQUEST_URI} [L]
RewriteCond %{HTTP_HOST} ^c\.example\.com$
RewriteRule !^css/ css%{REQUEST_URI} [L]

这将执行以下操作:

http://example.com/css/foo       externally to    http://c.example.com/foo
http://c.example.com/foo         internally to    /css/foo

http://example.com/images/bar    externally to    http://i.example.com/bar
http://i.example.com/bar         internally to    /images/bar

除了纠正不匹配的路径和主机名外:

http://i.example.com/css/foo     externally to    http://c.example.com/foo
http://c.example.com/images/bar  externally to    http://i.example.com/bar

当请求的样式表http://example.com/css/foo被重定向到http://c.example.com/foo并且样式表中的图像URI引用(如/images/bar)从此新的基URI解析并因此导致{{}时,会发生不匹配1}}而不是最初的http://c.example.com/images/bar