首页 > 解决方案 > 如何配置 .htaccess 规则以允许对特定图形文件的所有用户进行只读访问?

问题描述

在我用 php 编写并使用 Symfony v2.8 的网络应用程序中,我有一个联系页面,当提交给服务器时会创建两封应该包含图形的电子邮件,但是当实际包含此图形时,我收到以下错误:

Unable to open file for reading 
[https://fake.net/Resources/public/images/landing_page/mypic.png]
500 Internal Server Error - Swift_IoException

Stack Trace
in vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/FileByteStream.php
at line 144  -
    if (!isset($this->_reader)) {
        $pointer = @fopen($this->_path, 'rb');
        if (!$pointer) {
            throw new Swift_IoException(
                'Unable to open file for reading ['.$this->_path.']'
            );
        }

但是,问题不在于 swiftmailer,因为如果我不包含图形,则电子邮件会成功创建和发送。或者,当我用来保护我的网站的 .htaccess 文件被重命名时,电子邮件会再次成功创建并在包含图形图像时发送。

今天,在尝试解决此问题时,我发现在我的网络应用程序的几个页面中显示的相同图形现在在 .htaccess 就位时无法加载。我现在得到的错误是:

GET https://fake.net/Resources/public/images/landing_page/mypic.png
500 (Internal Server Error)

以下是我添加到 .htaccess 文件末尾的行:

# Allow access of the mypic logo for emails

<files mypic.png>
    order allow,deny
    allow from all
</files>

在上述语句之前是以下行,它一直在 .htaccess 文件中:

<IfModule mod_rewrite.c>

  RewriteEngine On

  <If "%{HTTP_REFERER} != ''">

    # Hot link prevention for css|gif}htm|html|jpg|js|mp3|mp4|php|png files
    # from any other domain than %{HTTP_HOST}
    # See http://tltech.com/info/referrer-htaccess/

    RewriteCond %{HTTP_REFERER} !^.*$ [NC]
    RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.* [NC]
    RewriteRule .*\.(css|gif}htm|html|jpg|js|mp3|mp4|php|png)$ - [NC,F]

  </If>

</IfModule>

虽然这些都没有将文件访问限制为只读,但文件的权限设置为 664 可以做到这一点。 当文件的权限为 666 时,.htaccess 可以强制只读访问吗?

该语句似乎授予对具有该名称的任何文件的访问权限,而不仅仅是我希望具有无限只读访问权限的一个特定文件,该文件位于 web\Resources\public\images\landing_page 目录中。但是,当我尝试使用相对或绝对路径时,电子邮件创建仍然会出现相同的错误。 请在建议的任何解决方案中解决这个问题。

显然,该声明导致网站访问图形出现问题。 如何正确覆盖控制在我的电子邮件中访问此文件的 .htaccess 规则?

有人告诉我将文件移出 .htaccess 文件控制的区域,但我的整个站点都由 .htaccess 控制,因此将图形文件移动到站点 web 目录上方的目录会使图形文件超出我的网站范围,所以也不可用。

标签: phpapache.htaccesssymfony-2.8file-access

解决方案


推荐阅读