如何在.htaccess中使用主机根目录实现子域名请求重定向到PHP文件
问题根因
- 路径解析规则误解:.htaccess中
RewriteRule的目标路径如果以/开头,会被解析为当前子域名对应站点的文档根目录下的相对路径,而非服务器根目录的绝对路径。你当前子域名的文档根目录为/home/asr/sub.domain.com/,填写的/home/asr/public_html/Test/index.php会被自动拼接为/home/asr/sub.domain.com/home/asr/public_html/Test/index.php,和报错信息完全吻合,自然无法找到对应文件。 - 缺少重写防循环逻辑:现有规则没有排除index.php本身的请求,重写后发起的index.php请求会再次命中规则,造成死循环。
- 缺少真实资源排除规则:现有规则会将站点下真实存在的静态文件、目录也重写到PHP文件,导致静态资源无法访问。
正确配置方案
首先确认Apache配置中对应站点的AllowOverride参数设置为All,且Apache运行用户对/home/asr/public_html/Test/目录有读取权限,然后将.htaccess内容替换为如下配置即可:
RewriteEngine on RewriteBase / # 排除真实存在的文件、目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 用相对路径指向跨目录的PHP文件,避免路径拼接错误 RewriteRule ^(.*)$ ../public_html/Test/index.php?path=%{REQUEST_FILENAME} [NC,L,QSA]
如果相对路径写法因服务器配置限制不生效,可以直接在子域名的Apache虚拟主机配置中添加别名规则:
Alias /handler.php /home/asr/public_html/Test/index.php
之后将.htaccess的重写规则修改为:
RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /handler.php?path=%{REQUEST_FILENAME} [NC,L,QSA]
内容的提问来源于stack exchange,提问作者Mahdi Khezrabadi
相关产品推荐
相关产品推荐

