2012-04-05 58 views
0

我想所有图像重定向到一个showimage.php图像,使用htaccess的htaccess的:重定向图像一个页面,显示

但是,如果我尝试像

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

图像出现(doh)

如何重定向所有图像,但不是如果它们是从showimage.php请求? (或从该服务器)

+0

因此,你的意思是,showimage.php脚本做某种形式的http获取到本地(或远程)apache服务器为图像提供服务? – huelbois 2012-04-05 12:09:35

+0

是的。 showimage.php需要$ _GET ['image']并为该图像提供 – mowgli 2012-04-05 12:13:32

+0

您如何准确获取图像内容?例如,showimage.php是否会向Apache服务器发出cURL请求? – huelbois 2012-04-05 17:01:15

回答

2

有两件事情可以做:

1,如果查询来自服务器 你只需要添加重写规则前RewriteCond指令,它说,没有重定向如果http查询的来源是此服务器,则不应执行RewriteRule。

RewriteCond %{REMOTE_ADDR} !127.0.0.1 

根据您的脚本请问该怎么弄,你可能需要改用你的服务器的私有IP。或者用这个IP添加另一个RewriteCond,以防止两者都被重定向。

2-您还可以根据查询的引用程序阻止重定向,但是您必须确保它与查询一起发送。 (referer是请求你的URL的源URL,例如,如果你在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 

您可能需要玩具了一下与完整引用者,而不是用户,如果这是足够了,但只是想法开始。 您可以检查哪些引荐你在访问日志(如果你有%{Referer的}我在您使用的LogFormat启用)

明白了:问题是,引用者是被要求的URL,而不是重写的一个(我应该考虑一下,这很明显)。所以,问题是,当你需要http://localhost/images/x.png时,它被改写为http://localhost/showimage.php?image=x.png,它为里面的页面提供服务。但引用者不是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:// [服务器的ip] /图片/富.png将显示一个html页面,其中包含“Here it is:”和所请求的图片,取自[DOCROOT] /images/foo.png。对于“不从该服务器”工作,只需在RewriteRule之前添加关于REMOTE_ADDR的前一个RewriteCond(当您不指定[OR]时,它们将用作AND条件 - 只有在两者都同时触发重写代码时条件是真实的 - 不是从这个服务器,而不是从PHP脚本)

+0

RewriteCond%{REMOTE_HOST}!127.0.0.1如果我尝试使用RewriteCond%{REMOTE_HOST} 127.0.0.1,所有图像都会被重定向,包括showimage.php。后者与RewriteCond%{HTTP_REFERER}!showimage.php。 – mowgli 2012-04-05 15:07:24

+0

should'nt REMOTE_HOST REMOTE_ADDR? – mowgli 2012-04-05 15:11:04

+0

是一样的,对不起,REMOTE_ADDR是正确的。在我的盒子上它与REMOTE_HOST一起工作(因为我d对传入的IP进行反向DNS(这是许多Apache安装中的标准),但会在其他配置上中断。我改变了答案 – huelbois 2012-04-05 15:19:28