已通过.htaccess将子域重写至主站页面,如何实现子域共享主站静态资源?
这个问题很常见,核心是要把静态资源请求和动态请求分开处理——你的现有规则会把所有子域请求都导向section.php,包括图片、CSS这些静态文件,所以我们需要先让静态资源绕过那个动态转发规则,直接指向服务器上的实际文件。
下面是具体的解决方案,分两种情况,你可以根据需求选择:
方案1:仅针对music.example.com优化
在你现有的规则前面,添加排除静态资源的条件,这样只有非静态资源才会被转发到section.php:
# 先排除静态资源请求,让它们直接访问对应文件 RewriteCond %{HTTP_HOST} ^music.example.com [NC] RewriteCond %{REQUEST_URI} !\.(jpg|jpeg|png|gif|css|js|ico|svg|webp)$ [NC] # 剩下的请求才转发到section.php RewriteRule ^(.*)$ section.php?url=music/$1 [L,NC,QSA]
方案2:通用处理所有子域(比如后续要加video.example.com等)
如果以后还要添加其他子域,用这个通用规则更高效,自动识别子域名并处理:
# 第一步:处理子域的静态资源,直接指向主域对应文件 RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example.com [NC] RewriteCond %{REQUEST_URI} \.(jpg|jpeg|png|gif|css|js|ico|svg|webp|woff|woff2)$ [NC] RewriteRule ^(.*)$ /$1 [L] # 第二步:处理子域的动态请求,转发到section.php并带入子域名 RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example.com [NC] RewriteRule ^(.*)$ section.php?url=%1/$1 [L,NC,QSA]
关键说明:
- 静态资源后缀可以根据你的实际需求补充,比如要支持字体文件就加
woff|woff2,支持PDF就加pdf,只要在括号里用|分隔就行。 - 确保你的子域和主域的
DocumentRoot是相同的(也就是服务器上的文件目录一致),这样/images/img.jpg在子域和主域指向的是同一个文件,自然就能访问到主站的资源。 [NC]标志是忽略大小写,比如.JPG和.jpg都能匹配;[L]标志表示匹配到这条规则后就停止处理后续规则,避免静态资源被误转发到section.php。
这样修改后,https://music.example.com/images/img.jpg就会直接返回服务器上/images/img.jpg的文件,和主站https://example.com/images/img.jpg完全一致,同时动态请求依然会正常转发到section.php。
内容的提问来源于stack exchange,提问作者Sergio D
相关产品推荐
相关产品推荐

