【问题标题】:Block direct link of an image but keep displaying it in pages阻止图像的直接链接,但继续在页面中显示它
【发布时间】:2013-08-03 15:57:57
【问题描述】:

假设我正在使用 Apache,并且我有一个示例 Web 文件夹,例如:

http://myserver.com/test/

在这个文件夹中,我有以下文件:

  • index.html
  • img.php
  • 样本.jpg
  • .htaccess

index.html 的代码如下:

<html>
    <body>
         <img src="sample.jpg" />
    </body>
</html>

img.php 的代码如下:

<?php
    if(!isset($_GET["path"])){
       exit()
    }
?>
<html>
    <body>
         <img src="<?php echo $_GET["path"] ?>" />
    </body>
</html>

我喜欢http://myserver.com/test/sample.jpg 显示http://myserver.com/test/img.php?path=sample.jpg 内容 (网址不变)

经过网上大量搜索,我写了以下代码,但它不起作用:/

RewriteEngine On
RewriteCond %{REQUEST_URI} \.(png|gif|jpe?g)$ [NC]
RewriteCond %{SCRIPT_FILENAME} \.(php|html)$ [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)$ /test/img.php?path=$1 [L]

第三行可能有一个!,但我不知道具体在哪里

【问题讨论】:

  • 您最终不会从 PHP 中得到与原始 HTML 相同的请求吗?
  • 在这个例子中是的。但在我的项目中,PHP 和 HTML 最终不同。
  • 我们在一个页面上谈论多少张图片?如果它不是太多,你总是可以让 php 读取图像数据并回显 base64 代码,不能完全链接到那个:)
  • 大约 20 张照片。这可能是一个解决方案...
  • 你会怎么做?

标签: image apache .htaccess redirect mod-rewrite


【解决方案1】:

用这个改变你的 .htaccess 代码:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /test/

# block direct access to images
RewriteCond %{HTTP_REFERER} !^http://(www\.)?myserver\.com/ [NC]
RewriteRule ^(.+?\.(?:png|gif|jpe?g))$ img.php?path=$1 [L,NC]

【讨论】:

  • 谢谢,但它不起作用:URL 更改为 http://myserver.com/test/img.php?path=sample.jpg,并且 index.html 和 img.php 中的图像都损坏了,因为它们没有正确的源路径。
  • 这不正是您写信时想要的:http://myserver.com/test/img.php?path=sample.jpg 吗?我现在删除了 R 标志,因此它不会更改 URL,但如果您的 img.php 没有提供正确的图像,您仍然会 404。
  • 谢谢。诀窍是:如果用户在他的浏览器中输入直接链接,则应用 PHP,否则什么都不做,这样页面(img.phpindex.html,等等...)可以继续显示此图像。我想有一个 RewriteCond 可以放在某个地方。
  • 如果我理解正确,我相信您需要基于 HTTP_REFERER 进行检查。修改了代码,请检查一下。
  • 几乎,当有多个图片时,它仅适用于第一张图片。我不知道为什么:/
【解决方案2】:

要将图像输出为 base64,您可以使用以下内容:

<img src="data:image/jpg;base64,<?php echo base64_encode(file_get_contents('/path/to/image.jpg'));?>"/>

请记住这是服务器路径,而不是文档根目录,因此您可能需要在正常图像文件路径前添加$_SERVER['DOCUMENT_ROOT']

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-26
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多