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

Apache2虚拟主机泛域名重定向至index.php配置问题求助

Apache2虚拟主机泛域名重定向至index.php配置问题求助

我来帮你排查这个问题!你现在遇到的跳转异常,核心原因是RewriteRule的写法错误,而且咱们得先对齐你的真实需求——看起来你是想让所有泛域名的请求都由主域名目录下的index.php处理(保持子域名URL不变,让代码层解析子域名),而不是做外部跳转对吧?那咱们一步步修正配置:

先分析你现有配置的问题

你写的这段规则是错误的:

RewriteCond %{HTTP_HOST} !^website\.com$ [NC]
RewriteRule (.*) http://(.*).website.com [L,R=301,QSA]

这里的问题是,RewriteRule的替换字符串里的(.*)会被Apache当成字面量字符,而不是正则捕获组的引用,所以才会出现转义后的%28.%2A%29.website.com这种奇怪的跳转地址,而且这条规则本身也不符合你要转发到index.php的需求。

修正后的完整虚拟主机配置

下面是调整后的配置,既能实现所有泛域名请求落到index.php,又能保留子域名URL让代码处理,还能正常访问静态资源:

<VirtualHost *:80>
    ServerAdmin admin@website.com
    ServerName website.com
    ServerAlias *.website.com
    DocumentRoot /var/www/html/site_admin/public_html

    <Directory /var/www/html/site_admin/public_html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/website.com-error.log
    LogLevel error
    CustomLog ${APACHE_LOG_DIR}/website.com.log combined

    RewriteEngine On
    # 排除真实存在的文件和目录(比如图片、CSS、JS等静态资源直接返回)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # 所有动态请求转发到index.php,保留查询参数
    RewriteRule ^(.*)$ /index.php [L,QSA]
</VirtualHost>

配置说明

  • 删掉了错误的301跳转规则,因为你需要的是内部转发(URL不变,请求由index.php处理),而不是外部跳转(URL会变成主域名)。
  • 新增的两个RewriteCond是为了避免静态资源(比如sub.website.com/logo.png)也被转发到index.php,保证静态文件可以直接访问。
  • RewriteRule里的L表示这是最后一条规则,QSA表示保留请求的查询字符串(比如sub.website.com?foo=bar的参数会传递给index.php)。

代码层处理子域名的小提示

在你的index.php里,可以通过$_SERVER['HTTP_HOST']获取当前访问的域名,比如:

$host = $_SERVER['HTTP_HOST'];
// 解析子域名,比如从sub.website.com中提取sub
$parts = explode('.', $host);
if(count($parts) >= 3){
    $subdomain = $parts[0];
    // 这里根据子域名做对应逻辑处理
}

备注:内容来源于stack exchange,提问作者igalsc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:29:50