如何配置.htaccess在域名根目录/子目录部署两站并解决子站加载不全
故障根因
PHP应用部署在/web-2子目录时,现有.htaccess完全是按根目录部署的规则编写的,三个核心问题直接导致站点加载异常:
- 缺少子目录重写基准路径配置,重写规则会把请求错误转发到域名根目录,而不是web-2目录下的入口文件
- 末尾斜杠重定向逻辑没有适配子目录,会把带斜杠的子目录路径错误跳转到根域名对应路径
- 静态资源拦截规则不全,漏了woff2、ico、map等常用静态后缀,这部分资源会被错误交给PHP解析,直接返回404或者错误响应
修复方案
直接用下面的配置替换web-2目录下原有的.htaccess文件即可:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 子目录部署必须配置重写基准路径,否则所有重写规则都会错位 RewriteBase /web-2/ # 强制HTTPS跳转,需要时取消下面两行注释即可 # RewriteCond %{HTTPS} !=on # RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 透传Authorization请求头,避免接口鉴权失效 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 修正末尾斜杠跳转逻辑,避免跳转到根目录路径 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 补全静态资源后缀匹配,所有静态资源直接返回,不走PHP解析 RewriteCond %{REQUEST_URI} !\.(css|js|svg|png|jpg|jpeg|gif|ico|robots\.txt|ttf|woff|woff2|eot|map|json)$ [NC] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # 明确指定重写到当前子目录下的入口文件 RewriteRule ^ /web-2/index.php [L] </IfModule>
替换后仍异常的排查项
如果替换配置后站点还是无法完整加载,按顺序检查:
- 确认Apache已经开启
mod_rewrite模块,未开启的话执行a2enmod rewrite && systemctl restart apache2生效 - 检查web-2目录的权限配置,确保web服务运行用户对该目录有读取、执行权限,和根目录下静态站点的权限保持一致即可
- 检查PHP应用自身的配置项,把应用的根URL从
domain.com修改为domain.com/web-2,避免应用内生成的资源链接、路由地址指向根目录 - 如果是Nginx反向代理Apache的架构,确认Nginx转发请求时没有去掉
/web-2路径前缀,要把完整请求URI传递给后端Apache
内容的提问来源于stack exchange,提问作者Abdullahi Munir
相关产品推荐
相关产品推荐

