.htaccess RewriteCond,其中URI不包含域

Jak*_*cas 13 php regex apache .htaccess mod-rewrite

我已经浏览了Google和StackOverflow以获得这个问题的答案,但事实上我对.htaccess了解不多,这无法帮助我确定我的情况的正确答案,所以我在这里问.

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

这一切都运行正常但我想确保每个站点都不能从浏览器访问彼此的图像等,除非它们在正确的域上.

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

/resources/{resource}/{full_domain_name}
Run Code Online (Sandbox Code Playgroud)

所以例如www.domain.co.uk会有这样的结构:

http://www.domain.co.uk/resources/images/www.domain.co.uk/some_image.jpg
Run Code Online (Sandbox Code Playgroud)

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

http://www.domain_2.co.uk/resources/images/www.domain.co.uk/some_image.jpg
Run Code Online (Sandbox Code Playgroud)

这不是一个真正的主要问题,因为这些目录中绝对没有存储敏感信息,但这更令人烦恼,我宁愿用户无法做到这一点(并不是说到目前为止任何人都没有).

我尝试将.htaccess文件放入/ resources目录,但是我坚持使用正则表达式等.

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

这就是我想出的:

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

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

/resources/images/{full_domain_name}
/resources/scripts/{full_domain_name}
/resources/stylesheets/{full_domain_name}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这些问题吗?

任何帮助,将不胜感激.

anu*_*ava 11

这是一个非常好的问题,如果可以,我会投票超过10次.我发布了我的答案,即使你在这里有一个接受的答案,因为我真的需要挖掘我所有的Apache资源来得出答案.以下是此问题所需的规则:

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

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

PS:既然我们不能用%在RHS变量作为反向参考,我使用正则表达式的特殊回引用变量\1RewriteCond这里.