【发布时间】:2015-06-17 13:30:44
【问题描述】:
我有一个 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 ...
根据我阅读的内容,我可以使用原子反向引用来检查 %{QUERY_STRING} 中是否存在 %{HTTP_HOST}。这个想法是构建这样的东西
RewriteCond %{HTTP_HOST}::%{QUERY_STRING} ^(.*?)::/\1/?
这显然在当前状态下不起作用。对此语法的任何帮助和进一步解释将不胜感激。
【问题讨论】:
-
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http://如何允许?img=somepath/images/imgX.png查询字符串? -
这就是重点,它不允许这样做。由于不满足条件,所以忽略其余部分,不应用RewriteRule Forbidden,正常处理请求。
标签: php regex apache .htaccess backreference