![htaccess-从外部文件动态生成允许规则](https://linux22.com/image/786039/htaccess-%E4%BB%8E%E5%A4%96%E9%83%A8%E6%96%87%E4%BB%B6%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E5%85%81%E8%AE%B8%E8%A7%84%E5%88%99.png)
Htaccess 可以通过外部文件设置变量作为值吗?
我想允许服务器上的 txt 文件中列出的所有 IP。
此 txt 文件由我们的系统通过脚本自动生成,用于将 DYNDNS 地址解析为 IP。
我可以以任何方式格式化这个外部文件,但我需要 HTACCESS 来包含它
以便 htaccess 动态填充允许部分:
# allow IP range by CIDR number
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
allow from yyy.yyy.yyy.yyy
allow from zzz.zzz.zzz.zzz
有什么建议吗?谢谢
答案1
由于您有权访问服务器配置,因此您可以创建一个RewriteMap
(mod_rewrite 的一部分)来引用您的 IP 地址文本文件。然后,您可以使用 mod_rewrite 在此重写映射中查找 IP 地址。本身RewriteMap
需要在服务器配置中定义,但可以从任何地方调用它(例如.htaccess
)。
例如:
您的 IP 地址文本文件...键/值对以空格分隔。您不需要包含实际团队成员的姓名(它不会在查找中使用),但它可能很有用。只需包含一些非“DENY”的文本值(因为这稍后会用作查找中的默认值)。如果您愿意,所有值都可以相同。
# /path/to/file/allowedips.txt
# IP addresses to allow access
1.1.1.1 Bob
2.2.2.2 Alice
3.3.3.3 Frank
4.4.4.4 Joe
在服务器配置中您定义RewriteMap
:
RewriteMap allowedips "txt:/path/to/file/allowedips.txt"
调用重写映射.htaccess
(或服务器配置)来阻止访问:
RewriteEngine On
RewriteCond ${allowedips:%{REMOTE_ADDR}|DENY} =DENY
RewriteRule ^ - [F]
DENY
就是默认值当重写映射中找不到 IP 地址时返回。
该F
标志触发 403 Forbidden 响应。
在对服务器配置进行更改后(即定义时RewriteMap
),您需要重新启动 Apache,但是当您只是更新包含 IP 地址列表的文本文件时,则无需重新启动服务器。
order deny,allow deny from all allow from xxx.xxx.xxx.xxx allow from yyy.yyy.yyy.yyy allow from zzz.zzz.zzz.zzz
Order
和指令在 Apache 2.4 中以前已弃用。Apache 2.4 的等效指令是。但是,它无法从文件中读取 IP 地址。虽然您可以使用 Apache 表达式读取文件的全部内容并根据正则表达式对其进行解析,但Deny
(如上所述)会更有效。虽然如果您无权访问服务器配置,这仍然是一个解决方案。Allow
Require
RewriteMap