子域名页面无法显示,跳转至app目录英文页面求助
问题排查与修复方案
1. 先确认子域名的文档根目录配置
检查主机面板(如cPanel、Plesk)里每个子域名的文档根目录是否准确指向对应子域名的独立文件夹,而非主站的public_html或app目录。如果只是在主站目录下创建了子域名文件夹,但未在面板中修改子域名的根目录指向,系统会默认沿用主站的路径规则,导致跳转到错误页面。
2. 修复ROOT_DIR配置代码的逻辑问题
你当前的配置代码逻辑存在错误,这是导致子域名跳转异常的核心原因:
$http_host = $_SERVER['HTTP_HOST']; if (empty($_SERVER['DOCUMENT_ROOT'])) // document root directory $ROOT_DIR = $_SERVER['HOME'] . '/public_html'; else { if (in_array($http_host, $sub_domains)) $ROOT_DIR = str_replace($http_host, 'public_html', $_SERVER['DOCUMENT_ROOT']); else $ROOT_DIR = $_SERVER['DOCUMENT_ROOT']; }
当匹配到子域名时,代码用str_replace将$_SERVER['DOCUMENT_ROOT']中的子域名替换为public_html,直接把根目录拉回主站路径,自然会显示主站app目录的英文页面。
修正后的配置代码
假设你的子域名目录结构为:
- 主站:
/home/user/public_html - 子域名
es.reverd.com:/home/user/es.reverd.com - 子域名
fr.reverd.com:/home/user/fr.reverd.com
可以改成以下两种方式:
方式一:固定映射子域名与目录
$http_host = $_SERVER['HTTP_HOST']; // 定义子域名对应目录的映射表 $subdomain_dir_map = [ 'es.reverd.com' => '/home/user/es.reverd.com', 'fr.reverd.com' => '/home/user/fr.reverd.com', // 补充其他子域名... ]; if (empty($_SERVER['DOCUMENT_ROOT'])) { $ROOT_DIR = $_SERVER['HOME'] . '/public_html'; } else { // 匹配子域名则用对应目录,否则用主站根目录 $ROOT_DIR = isset($subdomain_dir_map[$http_host]) ? $subdomain_dir_map[$http_host] : $_SERVER['DOCUMENT_ROOT']; }
方式二:子域名与目录同名时简化逻辑
$http_host = $_SERVER['HTTP_HOST']; // 列出所有子域名 $sub_domains = ['es.reverd.com', 'fr.reverd.com']; if (empty($_SERVER['DOCUMENT_ROOT'])) { $ROOT_DIR = $_SERVER['HOME'] . '/public_html'; } else { if (in_array($http_host, $sub_domains)) { $ROOT_DIR = $_SERVER['HOME'] . '/' . $http_host; } else { $ROOT_DIR = $_SERVER['DOCUMENT_ROOT']; } }
3. 检查服务器重定向规则
Apache环境(.htaccess)
如果主站的.htaccess有强制跳转到app目录的规则,需要在规则中排除子域名:
# 排除子域名,避免被主站规则影响 RewriteCond %{HTTP_HOST} !^es\.reverd\.com$ RewriteCond %{HTTP_HOST} !^fr\.reverd\.com$ # 原主站跳转到app目录的规则 RewriteRule ^(.*)$ /app/$1 [L]
或者在每个子域名的目录下创建独立的.htaccess,覆盖主站规则。
Nginx环境
为每个子域名单独配置server块,指定正确的根目录和索引文件,避免继承主站的重定向规则:
server { listen 80; server_name es.reverd.com; root /home/user/es.reverd.com; index index.php index.html; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
4. 清除缓存
修改配置后,清除浏览器缓存、服务器端缓存(如OPcache、Redis),确保新配置立即生效。
内容的提问来源于stack exchange,提问作者user22105603
相关产品推荐
相关产品推荐

