gpt4 book ai didi

.htaccess RewriteRule - DOCUMENT_ROOT 和 RewriteBase

转载 作者:行者123 更新时间:2023-12-04 22:37:07 30 4
gpt4 key购买 nike

我有一个安全/子目录,其中有几个文件,我想在这些文件上执行一些简单的 RewriteRules,只是默认一个 PHP 扩展。我很难让这些工作,经过反复试验,偶然发现了以下问题。

RewriteEngine On
RewriteBase /secure

# Force PHP extension if not a directory
RewriteCond %{DOCUMENT_ROOT}/secure/%{REQUEST_URI} -d
RewriteRule ^(.*)$ - [L]

RewriteCond %{DOCUMENT_ROOT}/secure/$1.php -f
RewriteRule ^((.*/)*[^./]+)/*$ $1.php [L]

我缺乏理解是在 %{DOCUMENT_ROOT}并附加 /secure/ .我相信 %{DOCUMENT_ROOT}或使用 RewriteBase会处理这个。然而,这些部分似乎都是必需的。我想知道每个人在我的案例中取得的成就和原因。

最佳答案

RewriteBase directive在重定向步骤期间由 mod_rewrite 独占使用,在所有其他处理期间被忽略。与文档所述相反,它通常不是必需的,因为(在您的情况下)URL 映射到文件系统中超出 DOCUMENT_ROOT 的子目录是相当常见的。 .

那么,指令的作用是什么?当您在每个目录上下文中评估您的规则时,就像使用 .htaccess 文件时一样,URL 在 Apache 的请求处理链中很晚才传递给 mod_rewrite。这意味着 URL 可能已经部分转换为文件系统路径,因此/directory/subdirectory/file 中的路径实际上可能已通过 Web 服务器通过/location/subdirectory/file 访问。

这似乎不是什么大问题,但是/location/片段丢失的事实对 mod_rewrite 造成了问题。要了解原因,您必须知道 mod_rewrite 如何使每个目录的上下文重写成为可能。

当您在 .htaccess 文件中执行重写时,mod_rewrite 将修改后的请求作为内部重定向重新注入(inject) Apache,就好像它是一个 URL。这是有问题的,因为请求路径可能不是要传递的适当 URL。例如,如果请求在/directory/subdirectory/file 结束(我们假设它在 DOCUMENT_ROOT 之外),我们可能在/directory/.htaccess 中有这个规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php

这将检查/subdirectory/file,确定它不是实际文件,并将其重写为 index.php。此时,必须将一个新的 URL 返回给 Apache,以进行内部重定向以完成重写。因为它没有引用点,所以它最终会发送整个路径——也就是说,它会发送/directory/index.php。这不是您想要的,因为访问该位置的 URL 实际上是/location/index.php。这就是 RewriteBase 的用武之地。通过指定
RewriteBase /location/

在 .htaccess 文件中,目录前缀/directory/将被替换为/location/作为此后重写处理的一部分,从而导致内部重定向到预期的 URL/location/index.php。

这也与外部重定向有关。如果您尝试使用 [R] 进行外部重定向仅带有路径的标志,并且该路径没有前导正斜杠,则整个目录将以上述方式发送回客户端,除非它被替换为 RewriteBase 中给出的值。

不过,这两点似乎都与您的情况无关,因此您应该可以不指定 RewriteBase。
%{DOCUMENT_ROOT} variable 只是 Apache 内部的值 DOCUMENT_ROOT变量,在您的服务器/虚拟主机配置中设置。它始终对应于对/的请求解析到的目录。 -f-d检查需要完整的文件系统路径,这就是 %{DOCUMENT_ROOT} 的原因使用它们时需要预先添加到相对路径。

然而,为了解析当前请求的路径,mod_rewrite 会使用 %{REQUEST_FILENAME} 为您解决这个问题。多变的。例如,假设 .htaccess 文件位于您的/secure 子目录中,您可以按如下方式修改您的规则集:
RewriteEngine On

# Force PHP extension if not a directory
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]

关于.htaccess RewriteRule - DOCUMENT_ROOT 和 RewriteBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126964/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com