【问题标题】:Modify working AddHandler to match files only in the CURRENT directory, NOT child directories修改工作 AddHandler 以仅匹配当前目录中的文件,而不是子目录
【发布时间】:2020-07-20 15:57:48
【问题描述】:

以下方法可以很好地允许在两个 XML 文件上执行 PHP:

<FilesMatch ^(opensearch|sitemap)\.xml$>
AddHandler application/x-httpd-php5 .xml
</FilesMatch>

然而不幸的是,这条规则也允许在任何子目录中发生这种情况。

  • /opensearch.xml,工作/期望匹配
  • /henchman24/opensearch.xml,工作/不是想要的匹配

我们如何强制Apache匹配当前目录中的文件,子目录?

我真的很想:

  • 避免在每个可能的子目录中添加子 .htaccess 文件。
  • 避免使用绝对服务器路径。

【问题讨论】:

标签: apache security apache2.4 addhandler


【解决方案1】:

If directive 可用于为处理程序提供一个condition,以便只为与当前文件夹中的模式匹配的文件添加。

以下示例将只为文档根目录中的文件添加处理程序,例如/sitemap.xml/opensearch.xml,但不为/folder/sitemap.xml/folder/opensearch.xml 添加处理程序

<FilesMatch ^(opensearch|sitemap)\.xml$>
<If "%{REQUEST_URI} =~ m#^\/(opensearch|sitemap)\.xml$#">
  AddHandler application/x-httpd-php .xml
</If>
</FilesMatch>

在上面的示例中,条件是检查REQUEST_URI 是否与m# # 中分隔的regex pattern 匹配。 ~= comparison operator 检查字符串是否匹配正则表达式。

模式^\/(opensearch|sitemap)\.xml$ 匹配REQUEST_URI variable(请求的URI 的路径部分),例如/opensearch.xml/sitemap.xml

^                      # startwith
\/                     # escaped forward-slash
(opensearch|sitemap)   # "opensearch" or "sitemap"
\.                     # .
xml                    # xml
$                      # endwith

【讨论】:

  • 有趣,虽然它损坏了 .htaccess 文件,我不得不删除它,但我不确定 Directory 位有什么问题?
  • 也许这适用于 Apache 2.2?我正在使用 Apache 2.4。我知道语法的工作方式有 一些 变化。 我应该从一开始就澄清 Apache 版本,我很抱歉。
  • @covener。此示例中使用的模式基于 OP 问题中的共享配置。如果必须匹配特定目录,则需要在模式中明确说明
  • @John 在 .htaccess 文件的上下文中不支持 Directory 指令。您是否考虑过使用 If 指令来限制在包含 .htaccess 文件的文件夹上设置处理程序?
  • 成功了!接受并投票赞成。我在不同目录中测试了同一文件的另一个副本。您能否澄清If 条件具体在做什么?
【解决方案2】:

您是否在 RewriteRule 中尝试过 H=?

RewriteEngine On
RewriteRule ^(opensearch|sitemap)\.xml$ . [H=application/x-httpd-php5]

在 htaccess 中重写具有内置属性,即任何子目录中的那些文件名都将在正则表达式测试的字符串中存在子目录,因此锚定的正则表达式不会在子目录中匹配。

【讨论】:

  • 不幸的是,这不是我们可以实现 suPHP 的地方。可能需要一两年,但最终我可能会发现这是正确的答案。由于无法对其进行测试,不幸的是,我至少还不能对其进行投票。
  • 我不知道答案与 suPHP 有什么关系,除非您的目标也隐含地与 suPHP 有关。
  • “不支持”是使用此规则后出现的 Apache 错误消息。经过进一步调查,这似乎与 PHP(cgi 与 suPHP)有关。我不知道为什么,不是我的专业领域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多