使用.htaccess通过子域提供静态文件

时间:2010-08-18 08:04:42

标签: performance .htaccess caching cdn static-content

是的,原谅我的愚蠢,我在t'interweb上看了很多例子,但我不认为我找到了我想要的东西。

我有一个网站,photography.example.com是主要网站,但我还希望有另一个子域来提供静态文件,例如static.photography.example.com

如果我请求一个文件(例如http://static.photography.example.com/js/jquery.js),我希望从非静态域中检索该文件,这样我就可以保持我的文件结构完全不受影响,但是使用多个域来允许更多的并发http请求。

我不想抛出任何会使浏览器移动文件的http响应,我只是想将文件从普通域镜像到静态域。在此之后,我将继续设置远期未来以改善缓存等。

如何使用.htaccess实现此目的?

编辑1

所以在经历了一些混乱后,我想出了这个:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.*)$ http://photography.example.com/$1 [L]

但这实际上重定向到我正在尝试阅读的域名,我希望它在静态域名下提供文件,任何修改此脚本的帮助都将非常感激。

编辑2

所以我修改了我的DNS并等了几天才传播它,但是CNAME技术也没有用。这是条目:

alt text

3 个答案:

答案 0 :(得分:2)

在你的问题中,你在谈论:

  1. Adding Expire headers for caching
  2. Splitting resources across domains
  3. 对于第1项,您可以在主域上编辑httpd.conf / .htaccess文件(在整个网站上都没有这样做,不是吗?)

    <IfModule mod_expires.c>
      ExpiresActive On
      ExpiresByType application/x-javascript A2592000
      ExpiresByType image/gif A2592000
      ExpiresByType image/jpeg A2592000
      ExpiresByType image/png A2592000
    </IfModule> 
    

    项目#2不需要任何Apache配置 - 只需使用 CNAME photography.example.com 配置static.photography.example.com DNS条目。这应该可以解决问题。

    或者您可以编辑httpd.conf并添加ServerAlias

    <VirtualHost xx.xxx.xxx.xx:80> 
    DocumentRoot / 
    ServerName photography.example.com 
    ServerAlias static.photography.example.com 
    </VirtualHost> 
    

    因此,目前,您不需要具有专用Apache配置的单独虚拟主机。

    以下是您希望一个单独的域以及一个具有专用配置的单独虚拟主机的其他一些原因

    如果您需要其中一个,或者您的缓存需求过于复杂(您不想缓存所有JS / CSS /图像,而是缓存它的一部分),那么您唯一的解决方案是:开始使用httpd.conf并为每个域编写单独的配置

答案 1 :(得分:0)

我认为您需要CNAME记录才能将static.photography.example.com请求传递给您的服务器,并且以特殊方式解析static.photography.example.com的.htaccess请求。

将以下重写规则添加到.htaccess应该可以解决这个问题

RewriteCond %{HTTP_HOST} !^(www\.)?photography.example.com$ [NC]

答案 2 :(得分:0)

我对这个问题的理解是 REDIRECT

http://static.photography.example.com/js/jquery.js

从以下地址获取文件(不更改浏览器上的URL):

http://photography.example.com/js/jquery.js

但请保留以下所有现有文件的网址 NOT REDIRECTED

http://static.photography.example.com/images.jpg

如果是,那么.htaccess应该有效:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)?.photography.example.com$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) http://photography.example.com/$1 [P]

此外,如果您有如下复杂规则,也可以使用 MAPPING

RewriteRule ^/file1\.js$ http://photography.example.com/file.js?q=444 [P]
RewriteRule ^/file2\.js$ http://photography.example.com/file.js?q=345 [P]
RewriteRule ^/file3\.js$ http://photography.example.com/file.js?q=999 [P]

map.txt的文件夹中创建一个文本文档(例如.htaccess)并输入以下内容:

file1   444
file2   345
file3   999

.htaccess将具有以下外观:

# Set a variable ("map") to access map.txt from config
RewriteMap map txt:map.txt

# Use tolower function to convert string to lowercase
RewriteMap lower int:tolower

# Get requested file name
RewriteCond %{REQUEST_URI} ^/([^/.]+)\.js$ [NC]

# Seek file name in map-file
RewriteCond ${map:${lower:%1}|NOT_FOUND} !NOT_FOUND

# Perform rewriting if the record was found in map-file
RewriteRule .? http://photography.example.com/file.js?q=${map:${lower:%1}} [P]