You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:htaccess通配符子域名转目录与index.php单文件处理配置问题

通配符子域名转向及请求统一处理的.htaccess配置方案

完整修正后的.htaccess代码

RewriteEngine On
DirectoryIndex index.php

# 处理通配符子域名跳转(排除www子域名,可根据需求删除)
RewriteCond %{HTTP_HOST} ^(.+)\.mywebsite\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.mywebsite\.com$ [NC]
RewriteRule ^(.*)$ https://mywebsite.com/%1/$1 [L,R=301,QSA]

# 转发非文件/目录请求到index.php,排除CSS文件
RewriteCond %{REQUEST_URI} !\.(css)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php [L,QSA]

规则逐条解释

1. 通配符子域名跳转规则

  • RewriteCond %{HTTP_HOST} ^(.+)\.mywebsite\.com$ [NC]
    匹配所有以mywebsite.com为后缀的子域名,(.+)捕获子域名前缀(比如a.mywebsite.com中的a),[NC]标记表示不区分大小写匹配。
  • RewriteCond %{HTTP_HOST} !^www\.mywebsite\.com$ [NC]
    可选规则,用于排除www.mywebsite.com,避免它被重定向到mywebsite.com/www/,如果需要保留www子域名的原有功能,保留这条即可。
  • RewriteRule ^(.*)$ https://mywebsite.com/%1/$1 [L,R=301,QSA]
    • ^(.*)$捕获当前请求的URI路径(比如a.mywebsite.com/b/c/d中的b/c/d);
    • %1引用第一个RewriteCond捕获的子域名前缀,$1引用当前规则捕获的URI路径;
    • R=301表示永久重定向(利于SEO),L表示执行完这条规则后停止后续规则解析,QSA表示保留原请求的查询字符串(比如a.mywebsite.com?foo=bar会重定向到mywebsite.com/a/?foo=bar)。

2. 请求转发到index.php规则

  • RewriteCond %{REQUEST_URI} !\.(css)$
    排除CSS文件,让这类静态资源直接被访问,不经过index.php处理。
  • RewriteCond %{REQUEST_FILENAME} !-f
    如果请求的是服务器上真实存在的文件(比如style.css),不执行转发规则。
  • RewriteCond %{REQUEST_FILENAME} !-d
    如果请求的是服务器上真实存在的目录,不执行转发规则。
  • RewriteRule ^(.+)$ index.php [L,QSA]
    把所有符合上述条件的请求转发到index.php,QSA保留查询字符串,L终止后续规则解析。

解决"服务器未找到"问题

你遇到的Firefox提示"服务器未找到",核心原因是DNS未配置通配符解析:
需要在你的域名管理后台添加一条通配符A记录,将*.mywebsite.com指向你的服务器IP地址。只有这样,浏览器才能解析a.mywebsite.com、b.mywebsite.com这类任意子域名,否则会因为无法找到对应IP而报错。


关于index.php获取目标数组的说明

当用户访问https://a.mywebsite.com/b/c/d时,经过重定向后实际请求的是https://mywebsite.com/a/b/c/d,此时$_SERVER['REQUEST_URI']的值为/a/b/c/d。使用以下代码即可得到目标数组:

$pathSegments = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
// $pathSegments 结果为 ['a', 'b', 'c', 'd']

原规则失效的原因

  1. 规则顺序错误:你之前可能把转发到index.php的规则放在了子域名跳转规则前面,导致子域名请求先被转发到index.php,无法触发跳转逻辑。跳转规则必须放在转发规则之前。
  2. DNS未配置通配符:这是导致子域名无法访问的直接原因,和.htaccess规则无关,必须先解决DNS解析问题。

内容的提问来源于stack exchange,提问作者Mart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:05:18