htaccess:将图像重定向到显示图像的页面

时间:2012-04-05 11:49:08

标签: apache .htaccess mod-rewrite

我想使用htaccess

将所有图像重定向到showimage.php

但如果我尝试类似

的话
RewriteRule ^images/([A-Za-z1-9]+).png$ showimage.php?image=$1 [L]

该页面上显示的图像也将被重定向(doh)

如何重定向所有图片,但如果从showimage.php请求? (或从此服务器)

1 个答案:

答案 0 :(得分:2)

您可以做两件事:

1-如果查询来自服务器,则不进行重定向 您只需在RewriteRule之前添加一个RewriteCond指令,该指令表示如果http查询的源是此服务器,则不会执行以下RewriteRule。

RewriteCond %{REMOTE_ADDR} !127.0.0.1

根据脚本的获取方式,您可能需要使用服务器的私有IP。或者使用此IP添加另一个RewriteCond,以防止两者被重定向。

2-您也可以根据查询的引用来阻止重定向,但您必须确保它随查询一起发送。 (referer是请求您的网址的源网址。例如,如果您在http://localhost/index.php并点击指向http://localhost/help.php的链接,则最后一个的引用将为http://localhost/index.php)。 您仍然使用RewriteCond,但使用HTTP_REFERER而不是REMOTEHOST。

例如:

RewriteCond%{HTTP_REFERER}!showimage.php

RewriteCond %{HTTP_REFERER} !/images/.*\.png

你可能不得不玩完整的参考者,如果这还不够用户,但只是想一想。 您可以在访问日志中检查您拥有哪个引用(如果您在使用的LogFormat中启用了%{Referer})

知道了:问题在于,REFERER是被问到的URL,而不是重写的URL(我应该考虑过它,很明显)。因此,问题在于,当您需要http://localhost/images/x.png时,它会被重写为http://localhost/showimage.php?image=x.png,其中包含内部页面。但是referer不是showimage.php而是... / images / x.png(初始URL)。因此,HTTP_REFERER上的RewriteCond必须检查原始URL是否类似于/images/*.png。

这是我的工作示例。规则在[DOCROOT] /。htaccess文件中:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !/images/.*\.png
RewriteRule ^images/([A-Za-z1-9-]+).png$ image.php?name=$1 [L]

这是我的image.php文件:

<html>
Here it is : <img src="/images/<?php echo $_GET['name']; ?>.png"/>
</html>

使用我的浏览器,调用http:// [server ip] /images/foo.png将显示一个html页面,其中包含“Here it is:”和所请求的图片,取自[DOCROOT] / images / foo.png。

对于“不从此服务器”起作用,您只需在RewriteRule之前添加先前的RewriteCond关于REMOTE_ADDR(当您未指定[OR]时,它们将作为AND条件工作 - 只有在两个条件下才会触发重写是真的 - 不是来自这个服务器而不是来自php脚本)