代码之家  ›  专栏  ›  技术社区  ›  Ben Everard

使用.htaccess通过子域服务静态文件

  •  0
  • Ben Everard  · 技术社区  · 14 年前

    好吧,请原谅我的愚蠢,我在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 回复  |  直到 9 年前
        1
  •  2
  •   Brian Clozel    14 年前

    在你的问题中,你说的是:

    1. Adding Expire headers for caching
    2. Splitting resources across domains

    对于项目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配置-只需配置static.photography.example.com dns条目 cname摄影.example.com . 这应该能解决问题。

    或者,您可以编辑httpd.conf并添加服务器别名

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

    所以现在,您不需要一个具有专用Apache配置的独立虚拟主机。

    以下是你想要的其他原因 一个单独的域和一个具有专用配置的单独虚拟主机 :

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

        2
  •  0
  •   LVS    14 年前

    我认为您需要CNAME记录以特殊方式将static.photography.example.com的请求传递到您的服务器和have.htaccess解析static.photography.example.com的请求。

    将以下重写规则添加到.htaccess应该可以做到这一点

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

        3
  •  0
  •   eQ19    9 年前

    我对这个问题的理解是 重定向

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

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

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

    但保留所有现有文件的URL,如 未重定向 :

    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]
    

    此外,您还可以使用 映射 如果你有一个复杂的规则,比如:

    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 )在文件夹中 .h访问 并输入以下内容:

    file1   444
    file2   345
    file3   999
    

    这个 .h访问 将具有以下外观:

    # 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]