放置在子文件夹中时,错误文档在 .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 中重定向的主要内容,如果未能解决你的问题,请参考以下文章
将配置文件放置在重定向文件夹中时,Configuration.Save 方法会引发未经授权的访问错误