HTACCESS Rules ISSUE

时间:2017-05-23 17:49:06

标签: php apache .htaccess

我的.htaccess中有以下规则,以防止直接访问这些文件扩展名。

loadOfAreas01  retrievals  storages  -  limitRetrieval  limitGoodsin  limitTotal
19             1           18        -  30              36            49
19             1           18        -  30              36            49

适用于Chrome,Firefox和Safari。对于Internet Explorer 11和Edge,即使它们不是直接访问,它也会阻止所有这些文件类型。例如。如果页面包含image.png,则不会显示该图像。

请注意,它与(htaccess) How to prevent a file from DIRECT URL ACCESS?相同,因为直接访问不仅适用于IE 11和Edge,而是适用于其他浏览器。

1 个答案:

答案 0 :(得分:1)

作为stated by Anubhava,这似乎是因为某些浏览器默认情况下不支持提供HTTP_REFERER标头值。

阅读这个问题(下面的链接列表)似乎是在网络最佳实践的裂缝之间滑落的;值HTTP_REFERERinsecure and easily forged(因此各种浏览器的最新版本不包括它)。

除此之外,它似乎是检查(惊讶!)引用页面对HTML标头的调用的唯一方法。

是基于不同浏览器更改.htaccess行为的原因。

我知道有几种解决方案,既不是完美的,也可能需要相当多的重新编码。

第一个解决方案

Edge的问题是没有给出HTTP_REFERER值,因此如果此值为空,只需使用mod_rewrite .htaccess标记即可在OR中允许:

RewriteEngine on 

RewriteCond %{HTTP_REFERER} !^$ [OR]
RewriteCond %{HTTP_REFERER} !^https://(www\.)?mydomain\.com(.*)?$ [NC]

RewriteRule \.(txt|pdf|jpg|png|svg)$ - [F]

这会添加一个空/空HTTP_REFERER,然后是OR逻辑门的检查,然后我将前两个规则汇总为单个域规则加上可选的文件路径字符串

这方面的优点是Edge [应该]工作,但是也不允许任何不提供HTTP_REFERER值的内容(例如新的浏览器窗口)。 Read more about a better variation on this approach here

二级解决方案

  • a)Use a cookie通知.htaccess该网站已被访问并做出相应反应。给cookie一个很短的时间框架,你必须按照自己的方式构建cookie设置系统。


  • b)如果你真的很腼腆,可以在图像中内置一个cookie读取系统,例如使用PHP文件来调用图像,它本身伪装成.jpg文件等。这将满足你的需要(禁止直接访问)但是将是一项重要的工作开销。

例如,如果您的<img src='/image.jpg?x=47457'>中有一个文件,而此image.jpg实际上是一个调用47457引用的JPG图像的PHP文件...

  • c)您甚至可以使用mod_rewrite对此进行扩展,以便对jpg文件的任何调用都可以重定向到imageprocessing.php?input=image.jpg,然后PHP代码可以检查是否存在有效的cookie /会话数据在加载和输出适当引用的文件之前......

无论如何(b)和(c)很容易长而复杂,但可以提供最可靠的结果。

阅读清单