38

是否可以在 .htaccess 中包含来自另一个 htaccess 文件的规则?

.htaccess

RewriteEngine On
RewriteCond ...
RewriteRule ...

Include .htaccess1
.
.
Include .htaccess2

这样做会得到 500。 此处不允许包含 有没有办法做到这一点?因为我非常需要这个。

4

4 回答 4

54

您不能在 htaccess 文件中包含来自其他文件的规则、语句、定义或指令。该Include指令不能在 htaccess 文件中使用。htaccess 文件的部分要点是类似于<Directory>块的行为,但是是自包含的并且无法访问目录本身之外的东西(子目录可以),但更具体地说,在文档根目录之外没有任何东西。这样,做恶意行为的人将无法通过入侵 htaccess 文件来指向请求或包含来自其他目录的文件/内容。

特别是在 mod_rewrite 的范围内,有一些选项RewriteOptions允许从父目录的 htaccess 文件继承重写规则,但不能任意包含任何地方的规则。

于 2012-11-30T07:32:34.673 回答
5

我知道这可能有点晚了,但是如果您尝试实施 IP 禁令或类似类型的动态规则内容,请使用 .htaccess 文件中的最后一条规则将请求指向单个 .php 或类似内容执行此功能的语言脚本(您的单个脚本可以以您自己的格式加载动态规则,并根据您实际尝试完成的内容做出与 Apache 相同的决定)然后将请求传递到被请求的实际页面。它为整个请求处理增加了一层,但为所有页面提供了相同的动态功能,而无需为服务器生成直接规则并尝试让 Apache 为您做出决定。

只是想我会为其他可能偶然发现这篇文章寻找类似内容的人添加这个想法。

于 2014-05-25T12:48:27.797 回答
3

这是可能的 - 在 2-3 步骤中......

  1. 创建要拒绝的 IP 文件。它可以是 .php 文件、.txt 文件,甚至 .csv 文件。

  2. 创建一个 .php(或您选择的语言)脚本,其目的是输出一个名为“.htaccess”的文件。

  3. 每次您将 IP 文件更新为拒绝时,运行上述 2) .php 脚本,并向您的每个域输出一个新的 .htaccess。

如果除了 IP 之外还有要拒绝的语句,请将它们硬编码在 .php 脚本中以首先输出。见https://www.askapache.com/htaccess/

.php 脚本通常看起来像:

$output = "statement1".PHP_EOL;
$output .= "statement2".PHP_EOL;
$output .= "statement3".PHP_EOL;
...

然后,当您准备好拒绝部分时:

$denyList = file_get_contents("the/list/of/IPs.txt"); // or .php etc.
$ArrayDenyList = explode(PHP_EOL,$denyList); // or your line ending character, if necessary
foreach($ArrayDenyList as $key =>$value) {
$output .= 'Deny from '.$value.PHP_EOL;
  }

然后编写文件:(你可能有一个标准的方式):

$handle = fopen(.htaccess,"w"); //complete path if in another domain
fwrite($handle,$output);
fclose($handle);
echo "Success - <p>";

如果您有多个域,则有一个包含这些域名路径的数组,并 foreach 该数组,然后写入每个路径。

如果某些域已经有 .htaccess 要求,请将其放入可读的 .txt 文件中...执行 file_get_contents(on that), "output =" that, 添加 "Deny's, 然后 "output .= ..." each in一个“foreach()”循环。

无论如何...您之前已经完成了所有这些事情...只需将每种技术应用于此场景即可。

.htaccess 文件不能“include()”其他文件,但 .php 脚本可以,并且 .php 脚本可以输出名为“.htaccess”的文件,这些文件可以由脚本构建。

上述方法有效,当我需要为我的每个产品目录创建“RewriteRule”行时,我就开始这样做了!每次我添加一个新产品时,我都会运行我的脚本来输出一个新的 .htaccess 文件......从我的产品 SQL 表构建。类似于我的“fwrite”我的 sitemap.xml 的 .php 脚本。

(我希望没有 .php 标点符号或“$”在这种输入中丢失。)

于 2017-11-26T23:44:06.667 回答
-5

您可以创建像 PHP ".htaccess.php" 这样的服务器端脚本,并在其中放入您的包含。当然,你必须配置apache:AccessFileName .htaccess.php

于 2015-10-31T12:36:44.757 回答