使用mod_rewrite忽略GET参数,基于引用重定向

时间:2011-11-08 21:00:08

标签: apache mod-rewrite

我正在尝试根据引用来限制使用mod_rewrite访问网页。 网页的网址是 http://www.example.com/path/to/page.php 它位于/var/www/path/to/page.php中的Debian服务器上 我有一个重写地图allowedReferers,其中包含一个网址列表

allowedReferers

  

http://www.example.com/test/test1.php:white

     

http://www.example.com/test/test2.php:white

我还有以下重写条件/规则

重写

Cond %{HTTP_REFERER} ^(.*)$
RewriteCond ${allowedReferers:%1|black} ^black$ [NC]
RewriteRule /* http://www.someotherplace.com [R,L]

到目前为止,这非常有效。

  

http://www.example.com/test/test1.php

     

http://www.example.com/test/test2.php

可以访问网站,而

  

http://www.example.com/test/test3.php

被重定向到someotherplace.com。

我的问题是,在现实生活中,我的引用将包含GET参数。 e.g。

  

http://www.example.com/test/test1.php?id=245

我的想法是将第一个条件重写为类似的东西

RewriteCond %{HTTP_REFERER} ^(.*)\?.*$

或者

 RewriteCond %{HTTP_REFERER} ^(.*)\?id=[0-9]*$

我在Firefox的RegexTester中测试了两个正则表达式,它们的行为与我想要的一样。 应用于以下输入

  

http://www.example.com/test/test1.php?id=245

他们为$1返回此内容:

  

http://www.example.com/test/test1.php

我希望%1还包含减去GET参数的URL。 所以,保持规则的其余部分不变:

RewriteCond ${allowedReferers:%1|black} ^black$ [NC]
RewriteRule /* http://www.someotherplace.com [R,L]

应该导致预期的行为:

  

http://www.example.com/test/test1.php?id=234

     

http://www.example.com/test/test2.php?id=222

可以访问网站,而

  

http://www.example.com/test/test3.php?id=256

(或http://www.athirdplace.com/等)

将被重定向到someotherplace.com

不幸的是,它根本没有表现出预期的行为。 将更改应用于第一个条件后,每个引用者都可以访问该网站。

由于我想看看%1内部究竟是什么,我提出了以下想法:

RewriteCond %{HTTP_REFERER} ^(.*)\?id=[0-9]*$
RewriteCond ${allowedReferers:%1|black} ^black$ [NC]

RewriteRule /* %1 [R,L]

假设从

引用该页面
  

http://www.example.com/test/test2.php?id=234

会将我重定向到

  

http://www.example.com/test/test2.php

错误的假设。它将我重定向到

  

http://www.example.com/var/www/path/to/

正如我在开头所提到的那样,访问将被限制的页面的地址。 当然会引发404,因为/var/www/是docroot。

重定向到%1只是一个绝望的尝试来调试我的问题,所以我不需要一个解决方案来实现这一目标。我正在寻找的是一种解决我原来的重定向问题的方法。 像这样的参考者

  

http://www.example.com/test/test1.php?id=234

     

http://www.example.com/test/test2.php?id=222

(无论传递哪个ID)

转到

  

http://www.example.com/path/to/page.php

而其他一切都是

  

http://www.someotherplace.com

最后,我还要了解如何调试mod_rewrite的任何想法,特别是查看%{HTTP_REFERER}%1$1等内容的方法。

1 个答案:

答案 0 :(得分:0)

刚刚找到一个解决方案如何(至少部分地)调试mod_rewrite:

http://www.latenightpc.com/blog/archives/2007/09/05/a-couple-ways-to-debug-mod_rewrite

提供了一个非常方便的技巧来输出mod_rewrite正在使用的一些值。 我稍微修改了一下这个例子:

RewriteCond %{HTTP_REFERER} ^(.*)\?id=[0-9]*$

RewriteRule (.*) /path/to/mod_rewrite_debugger.php?referer=%{HTTP_REFERER}&p1=%1 [R=301,L,QSA]

mod_rewrite_debugger.php只包含

echo "<pre>"; print_r($_GET); echo "</pre>"

输出结果为:

[referer] => http://vfh143.beuth-hochschule.de/tests/moodle3.php?id=3

[p1] => http://vfh143.beuth-hochschule.de/tests/moodle3.php

这表明我原来的假设是正确的。

不幸的是,当应用第二个条件时,调试器不再起作用了:

RewriteCond %{HTTP_REFERER} ^(.*)\?id=[0-9]*$

RewriteCond ${allowedReferers:%1|black} ^black$ [NC]

RewriteRule (.*) /path/to/mod_rewrite_debugger.php?referer=%{HTTP_REFERER}&p1=%1 [R=301,L,QSA]

产生以下输出:

[referer] => http://vfh143.beuth-hochschule.de/tests/moodle3.php?id=3

[p1] => 

事实证明,这些规则突然按原计划运作。问题解决了。

也许这有助于某人。