包含 .htaccess 中的另一个 htaccess 文件

问题描述 投票:0回答:5

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

.htaccess

RewriteEngine On
RewriteCond ...
RewriteRule ...

Include .htaccess1
.
.
Include .htaccess2

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

.htaccess
5个回答
59
投票

您不能在 htaccess 文件中包含来自其他文件的规则、语句、定义或指令。

Include
指令不能在 htaccess 文件内使用。 htaccess 文件的部分要点是与
<Directory>
块类似,但它是自包含的,无法访问目录本身之外的内容(子目录也可以),但更具体地说,不能访问文档根目录之外的内容。这样,恶意行为的人将无法通过破解 htaccess 文件来指向请求或包含其他目录中的文件/内容。

特别是在 mod_rewrite 范围内,

RewriteOptions
有一些选项,允许从父目录继承 htaccess 文件的重写规则,但不能任意包含来自任何地方的规则。


7
投票

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

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


4
投票

这是可能的 - 只需 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 该数组,然后 fwrite 到每个路径。

如果某些域名已经有 .htaccess 要求,请将其放入可读的 .txt 文件中...执行 file_get_contents(对此),“output =”,添加“Deny”,然后每个“output .= ...”在“foreach()”循环中。

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

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

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

(我希望没有 .php 标点符号或“$”在这次打字中丢失。)


0
投票

我在切换到

fail2ban
之前使用了这个小型 PHP 脚本。这是代码,以防有人需要。

基本上,它将自动生成的拒绝规则块附加到 .htaccess 文件中,类似于 cPanel,并且仅一遍又一遍地覆盖该块。

<?php
$subdomains_path_to_check = "/home/xxxx/application/domains/*";
$subdomains               = glob($subdomains_path_to_check);

// I have a CSV file with these IPS populated from multiples sources
// IP, date, reason
$file = fopen('banned_ips.csv', 'r');

// Create deny block
$block_start_text = '# php_auto_generated|banned_ips_start|do_not_edit';
$block_end_text   = '# php_auto_generated|banned_ips_end|do_not_edit';

// Deny block starts with this
$deny_block = [$block_start_text];
// Create deny rules  
while (($line = fgetcsv($file)) !== FALSE) {
    $deny_block[] = "Deny from {$line[0]} # Date: {$line[1]} | Reason: {$line[2]} \n";
}
fclose($file);
// Deny block ends with this
$deny_block[] = $block_end_text;

// Create deny block from all components above
$deny_block_txt = join('\n', $deny_block);

// Clean and overwrite htaccess files
foreach ($subdomains as $path_to_subdomain) {
    $htacces_path = $path_to_subdomain . '/.htaccess';
    if (file_exists($htacces_path)) {
        $htaccess_content = file_get_contents($htacces_path);
        // matches anything that starts with $block_start_text and ends with $block_end_text
        $regex_rule_to_clean_it = '/' . preg_quote($block_start_text) . '.*' . preg_quote($block_end_text) . '/gs';

        // Clean previous rules
        $htaccess_content = preg_replace($regex_rule_to_clean_it, '', $htaccess_content);

        // Append new rules
        $htaccess_content .= '\n\n' . $deny_block_txt;
        file_put_contents($htacces_path, $htaccess_content);
    }
}
?>

-7
投票

您可以创建服务器端脚本,例如 PHP“.htaccess.php”,并将您的包含内容放入其中。当然,你必须配置apache: 访问文件名.htaccess.php

© www.soinside.com 2019 - 2024. All rights reserved.