.htaccess RewriteCond,其中URI不包含域 - php

我已经在Google和StackOverflow上四处寻找有关此问题的答案,但是我对.htaccess不太了解这一事实并不能帮助我确定适合我的情况的正确答案,所以我在这里问。

我的情况是,我有几个站点使用与服务器上的根目录相同的物理目录。

一切正常,但我想确保每个站点都无法从浏览器访问彼此的图像等,除非它们位于正确的域中。

目前,我有一个像这样的文件结构:

/resources/{resource}/{full_domain_name}

因此,例如www.domain.co.uk具有这样的结构:

http://www.domain.co.uk/resources/images/www.domain.co.uk/some_image.jpg

但是,如果www.domain_2.co.uk存在使用相同的物理目录作为站点根目录,则他们可以从自己的域中查看其他域的资源,如下所示:

http://www.domain_2.co.uk/resources/images/www.domain.co.uk/some_image.jpg

这并不是真正的主要问题,因为在这些目录中绝对没有存储敏感信息,但这更令人烦恼,我宁愿用户也无法做到这一点(不是到目前为止,实际上没有人知道)。

我试图将.htaccess文件放到/ resources目录中,但是我被正则表达式等困扰。

我基本上想确保URI包含当前域名,否则重定向到403错误页面。

这是我想出的:

RewriteCond %{REQUEST_URI} !^(/resources/[^/]*/%{HTTP_HOST})(.*)$
RewriteRule ^(.*)$ /error/403.php

我放入[^/]位的原因是因为有多个文件夹,例如:

/resources/images/{full_domain_name}
/resources/scripts/{full_domain_name}
/resources/stylesheets/{full_domain_name}

有人可以在这些情况下帮助我吗?

任何帮助,将不胜感激。

参考方案

这是一个了不起的问题,如果我可以投票十次以上。即使您在这里已经接受了一个答案,我仍会发布我的答案,因为我确实必须挖掘我所有的Apache资源来提出答案。这是解决此问题所需的规则:

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

RewriteCond %{HTTP_HOST}:%{REQUEST_URI} !^([^:]+):/resources/[^/]+/\1/.+ [NC]
RewriteRule ^resources/[^/]+/[^/]+/.+ - [F,NC,NE]

PS:由于我们不能在RHS上使用%变量作为反向引用,因此我在\1中使用特殊的正则表达式反向引用变量RewriteCond

当使用.htaccess RewriteRule时,似乎POST值丢失。 GET值确定。怎么修? - php

几天前,我有一个关于从地址栏中删除index.php的问题,因此页面地址看起来更短更好。此问题的最短解决方案是(RewriteRule ^index.php / [L,R=301] in the .htaccess file)。而且有效!由于我将该字符串放入.htaccess中,因此某些页面被重定向到主页。我花了很多时间去猜测,为什么。据我了解,答案是:对于…

如何隐藏实际的下载文件夹位置 - php

我想隐藏下载文件夹的位置,以便用户下载文件时看不到该位置。我认为可以使用.htaccess文件完成此操作,但是我该怎么做?另外,如何用PHP完成呢? 参考方案 这是我在PHP中执行的操作:<?php $fakeFileName= "fakeFileName.zip"; $realFileName = "realFileNa…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…