放置在子文件夹中时,错误文档在 .htaccess 中重定向

Posted

技术标签:

【中文标题】放置在子文件夹中时,错误文档在 .htaccess 中重定向【英文标题】:ErrorDocument redirect in .htaccess when placed in subfolder 【发布时间】:2021-12-13 00:12:05 【问题描述】:

我的开发服务器 (localhost) 已设置为每个网站都在它自己的子文件夹中,如下所示:

localhost
   \Site1
   \Site2

每个子文件夹(Site1、Site2 等)都有自己的 .htaccess:

ErrorDocument 404 /alert.php?error=404
ErrorDocument 403 /alert.php?error=403
ErrorDocument 401 /alert.php?error=401

这在实时服务器上工作得非常好(因为它位于网站根位置),但是,在我的 localhost 开发环境中,我必须将 htacess 更新为:

ErrorDocument 404 /site1/alert.php?error=404

为了让它工作。这意味着当我想在本地测试而不是为实时版本上传时,需要来回更新 .htaccess。

.htaccess 是否可以根据主机 enovirnoment 确定要使用的正确路径?

【问题讨论】:

您可以在 Apache config 中设置一个环境变量,并在 .htaccess 中基于此设置不同的指令 @JS77 你是怎么回答我的? 【参考方案1】:

您可以使用 mod_rewrite 计算“基本目录”(.htaccess 文件相对于文档根目录所在的目录)并在 Apache 表达式的帮助下在 ErrorDocument 指令中使用它(需要 Apache 2.4.13)。

例如:

# Calculate the BASE_DIR based on the location of the .htaccess file (rel to DocumentRoot)
# For use in the ErrorDocument directive the BASE_DIR does not include the slash prefix
# eg. If in the root directory then BASE_DIR = "" (empty)
#     If in /site1/.htaccess then BASE_DIR = "site1/"
RewriteCond %REQUEST_URI@$1 ^/(.*?)([^@]*)@\2
RewriteRule (.*) - [E=BASE_DIR:%1]

# Set ErrorDocument dynamically relative to BASE_DIR (Requires Apache 2.4.13+)
# The 2nd argument to the ErrorDocument directive must be prefixed with a slash
# in the source code itself for it to be interpreted as a local path.
ErrorDocument 404 /%reqenv:BASE_DIRalert.php?error=404

因此,如果.htaccess 文件位于文档根目录中,则ErrorDocument 设置为/alert.php?error=404,如果在/site1 子目录中,则设置为/site1/alert.php?error=404

旁白: 使用 PHP 时,您不需要将错误代码显式传递给 alert.php 脚本,因为这在 $_SERVER['REDIRECT_STATUS'] 超全局中可用。这还允许您确定是否直接调用了 alert.php 脚本。

但是,最好在自己的<VirtualHost> 中定义每个站点,并使用它自己的DocumentRoot,而不是使用子目录,并且对于本地具有完全相同的目录/URL 结构像在实时服务器上一样开发 - 没有混乱。肯定还有其他地方会受到不同路径深度的影响,比如客户端到静态资源的链接?

【讨论】:

以上是关于放置在子文件夹中时,错误文档在 .htaccess 中重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何应用份认证模块和.htaccess文件保证Web安全

在子文件夹中维护单独的.htaccess文件

将配置文件放置在重定向文件夹中时,Configuration.Save 方法会引发未经授权的访问错误

htaccess - 在子文件夹中安装 Symfony2

Laravel - 部署在子文件夹中时防止公共之外的文件访问

htaccess 文件不会带我进入 404 错误页面