【问题标题】:Using .htaccess to serve static files via a subdomain使用 .htaccess 通过子域提供静态文件
【发布时间】:2024-04-26 12:45:01
【问题描述】:

好吧,原谅我的愚蠢,我在 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 技术也不起作用。这是条目:

【问题讨论】:

  • 你没有 - 你在 httpd.conf 中设置了这个。如果您还没有使用虚拟主机,它应该可以正常工作。如果是,则应将虚拟主机块复制到第二个域。
  • 如果您访问 static.photography.example.com,现在会发生什么?它通向哪里?
  • 它将我重定向到photography.example.com,我不想被重定向,我只想在新的子域下提供内容。
  • 你是在 cPanel 下还是什么?
  • 几乎...我正在使用 Plesk :-)

标签: performance .htaccess caching cdn static-content


【解决方案1】:

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

  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 配置 - 只需使用 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 并为每个域编写单独的配置

【讨论】:

  • CNAME 技术似乎不起作用,请参阅我的问题的编辑 2
  • 您是否:1- 删除之前的 .htaccess 条目(编辑 1) 2- 在服务器配置中添加静态域作为 ServerAlias?
【解决方案2】:

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

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

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

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

但将所有现有文件的 URL 保留为 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]

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

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]

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】: