在 RewriteCond 中使用反向引用过滤 QUERY_STRING

Filtering QUERY_STRING with back references in RewriteCond

我有一个 PHP 脚本,用于在将图像显示在网页上之前对其进行处理。必须检查查询字符串以拒绝来自外部域的所有请求。 如果 TLD 是 example.com

http://example.com/process.php?img=somepath/images/imgX.png OK
http://example.com/process.php?img=http://example.com/anotherpath/folder/images/imgX.png OK
http://example.com/process.php?img=http://anotherdomain.com/images/someimg.jpg Rejected!

此重写规则适用于我的测试服务器:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http://
RewriteCond expr "! %{QUERY_STRING} -strmatch '*%{HTTP_HOST}*'"
RewriteRule .* - [F]
</IfModule>

但是在生产服务器上这不起作用。经过一些头痛和搜索后,我发现在 Apache 2.4 之前不支持 expr...
根据我的阅读,我可以使用原子反向引用来检查 %{HTTP_HOST} 是否存在于 %{QUERY_STRING} 中。这个想法是构建这样的东西

RewriteCond %{HTTP_HOST}::%{QUERY_STRING} ^(.*?):://?

这显然在当前状态下不起作用。对此语法的任何帮助和进一步解释将不胜感激。

如果您想在 PHP 土地上这样做,那么您可以使用 parse_url.

Link to PHP documentation.

您可以在 Apache 2.2 中使用此规则:

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http://
RewriteCond %{HTTP_HOST}#%{QUERY_STRING} !^([^#]+)#.*?
RewriteRule ^ - [F]

</code> 是 <code>HTTP_HOST

的反向引用

将 RewriteCond 修改为

RewriteCond %{HTTP_HOST}#.*#%{QUERY_STRING} !^([^#]+)#.*?

这会捕获任何 URL 结构。杰夫