0

我想使用 htaccess 将所有图像重定向到 showimage.php

但是如果我尝试类似的东西

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

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

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

4

1 回答 1

2

你可以做两件事:

1- 如果查询来自服务器,则不重定向您只需在 RewriteRule 之前添加一个 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

如果这足够了,您可能不得不与完整的引用者而不是用户一起玩弄,而只是开始的想法。您可以检查访问日志中的引用者(如果您在使用的 LogFormat 中启用了 %{Referer}i)

明白了:问题是,REFERER 是被询问的 URL,而不是重写的 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://[server ip]/images/foo.png 将显示一个 html 页面,其中包含“这里是:”和请求的图片,取自 [DOCROOT]/images/foo.png .

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

于 2012-04-05T12:21:26.927 回答