我想要做的是将所有图片(jpeg,png,gifs?)重定向到index.php?q =文件,该处理程序将使用<img src=file>
标记。
但我担心从该标签调用文件时会产生无限循环
所以基本上我要问的是如何仅将外部呼叫重定向到图像
(或者有更好的方法来保护我的图像吗?)
答案 0 :(得分:2)
<强> That rule creates a handler which takes all matching requests to imageHandler.php
强>
请你试试下面的规则;
RewriteRule ^(.*)(.jpg|.jpeg|.png|.gif|.bmp|.etc)$ imageHandler.php?f=%{REQUEST_FILENAME} [QSA,L]
您将获得 $_GET["f"]
作为请求的文件名, $_GET["f"]
代表服务器上文件的路径。
PS:这个规则不会导致你的请求无限循环,只有imageHandler.php会执行一些进程,你可以决定是否返回文件。请注意,您必须为imageHandler.php实现二进制输出,这可能会导致您的操作成本。要降低该操作的成本,您可能必须为imageHandler.php实现客户端缓存或服务器缓存机制。
<强> That rule creates a redirect handler which redirects all matching requests to index.php
强>
RewriteCond %{HTTP_REFERER} ^$ #That means referer is empty which means direct access to file
RewriteCond %{HTTP_REFERER} !^http://www\.example\.com.* #That means referer is not my domain because when you use a file in <img> tag that will create a request to that image with referer of embedding address
RewriteCond %{REQUEST_URI} !^index.php #That means request not targeted to index.php (which a part of endless loop)
RewriteCond %{REQUEST_FILENAME} -f #That means request targeted to a file
RewriteCond %{REQUEST_URI} (.jpg|.jpeg|.png|.gif|.bmp)$ #That means request ends with .ext
RewriteRule ^(.*)(.jpg|.jpeg|.png|.gif|.bmp|.etc)$ http://example.com/index.php?f=$1 [R=302,L,QSA] #That means redirect request to index.php?f=file
我没有机会测试第二个,因为我没有Linux环境但是生产并且无法在生产环境中测试它。
希望这些信息可以帮助您了解您的情况。
答案 1 :(得分:2)
您可以使用:
RedirectMatch ^/(.+\.(jpg|png|gif))$ /index.php?f=$1
这会将以.jpg,png或gif结尾的任何请求重定向到/index.php。
请注意,这是一个外部重定向,如果要在内部将这些请求重定向到index.php,可以使用@cihanUygun提供的rewriteRule。