Apache配置问题:将子目录访问重定向至子域名
Apache子目录重定向至子域名+访问控制配置方案
1. 启用必要Apache模块
首先确保启用重写和别名模块(若用Alias指向子目录):
a2enmod rewrite a2enmod alias
执行后重启Apache生效:
systemctl restart apache2
2. 主域名(example.cloud)VirtualHost配置
修改主域名的HTTPS虚拟主机配置,添加重定向规则并限制直接访问:
<VirtualHost *:443> ServerName example.cloud DocumentRoot /var/www/html # 保留原有SSL配置(SSLCertificateFile、SSLCertificateKeyFile等) # 开启重写引擎 RewriteEngine On # 匹配直接访问子目录的请求,重定向到子域名 RewriteCond %{HTTP_HOST} ^example\.cloud$ RewriteRule ^/subdirectory1/subdirectory2/(.*)$ https://subdomain.example.cloud/$1 [R=301,L] # 严格限制直接访问子目录(仅允许子域名请求) <Directory "/var/www/html/subdirectory1/subdirectory2"> # 先默认拒绝所有 Require all denied # 匹配子域名的请求,设置允许环境变量 RewriteCond %{HTTP_HOST} ^subdomain\.example\.cloud$ RewriteRule ^ - [E=ALLOWED_SUBDOMAIN:1] # 仅允许带有该环境变量的请求 Require env ALLOWED_SUBDOMAIN </Directory> </VirtualHost>
3. 子域名(subdomain.example.cloud)VirtualHost配置
确保子域名正确指向目标子目录,权限设置正常:
<VirtualHost *:443> ServerName subdomain.example.cloud DocumentRoot /var/www/html/subdirectory1/subdirectory2 # 保留原有SSL配置 <Directory "/var/www/html/subdirectory1/subdirectory2"> Options FollowSymLinks MultiViews AllowOverride All Require all granted </Directory> </VirtualHost>
4. 替代方案:使用.htaccess(无需修改主配置)
若没有权限修改VirtualHost配置,可在主域名根目录的.htaccess中添加:
RewriteEngine On # 重定向直接访问子目录的请求到子域名 RewriteCond %{HTTP_HOST} ^example\.cloud$ RewriteRule ^subdirectory1/subdirectory2/(.*)$ https://subdomain.example.cloud/$1 [R=301,L]
常见问题排查
- 执行
apache2ctl configtest检查配置语法错误,确保无拼写失误 - 301重定向会被浏览器缓存,测试阶段可改用
R=302临时重定向,避免缓存干扰 - 若之前配置过
ProxyPass,确保重写规则放在ProxyPass指令之前,否则会被覆盖 - 确认子目录的文件系统权限正确,Apache进程拥有读取权限
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

