子目录下.htaccess的ErrorDocument跳转如何适配本地与线上环境
方案1:相对路径适配(最简方案)
直接删除原配置中路径开头的根路径标识/,非根路径开头的地址会自动相对于.htaccess所在目录解析,无需修改即可同时适配本地子目录和线上根目录环境:
ErrorDocument 404 alert.php?error=404 ErrorDocument 403 alert.php?error=403 ErrorDocument 401 alert.php?error=401
注意:如果站点存在多级嵌套路径访问,相对路径会相对于当前访问的URI目录解析,可能出现文件找不到的问题,该场景推荐使用方案2。
方案2:环境变量条件判断(兼容性最佳)
通过判断当前访问的主机名自动切换路径规则,Apache 2.4及以上版本可直接使用:
# 识别本地开发环境 SetEnvIf Host "^(localhost|127\.0\.0\.1)$" is_local=1 <If "env('is_local') == 1"> # 本地环境配置,替换为对应站点的子目录路径即可 ErrorDocument 404 /Site1/alert.php?error=404 ErrorDocument 403 /Site1/alert.php?error=403 ErrorDocument 401 /Site1/alert.php?error=401 </If> <Else> # 线上环境配置 ErrorDocument 404 /alert.php?error=404 ErrorDocument 403 /alert.php?error=403 ErrorDocument 401 /alert.php?error=401 </Else>
方案3:重写规则动态匹配
低于2.4版本的Apache可以使用mod_rewrite实现自适应跳转:
RewriteEngine On # 404场景:请求的文件/目录不存在时重写到当前站点根目录的alert.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ /Site1/alert.php?error=404 [L] # 其他错误码配置 ErrorDocument 403 /Site1/alert.php?error=403 ErrorDocument 401 /Site1/alert.php?error=401
部署到线上时只需要把路径中的站点子目录前缀删除即可,也可以配合部署脚本自动替换,无需手动修改。
内容的提问来源于stack exchange,提问作者JS77
相关产品推荐
相关产品推荐

