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
相关产品推荐
相关产品推荐

