我想使用htaccess
将所有图像重定向到showimage.php但如果我尝试类似
的话RewriteRule ^images/([A-Za-z1-9]+).png$ showimage.php?image=$1 [L]
该页面上显示的图像也将被重定向(doh)
如何重定向所有图片,但如果从showimage.php请求不? (或从此服务器)
答案 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脚本)