我已经浏览了Google和StackOverflow以获得这个问题的答案,但事实上我对.htaccess了解不多,这无法帮助我确定我的情况的正确答案是什么,所以我在问这里。
我的情况是我有几个站点使用与服务器上的root相同的物理目录。
这一切都运行正常,但我想确保每个网站都无法从浏览器访问彼此的图片等,除非它们位于正确的域中。
目前我的文件结构如下:
/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}
有人可以帮我解决这些问题吗?
任何帮助都将不胜感激。
答案 0 :(得分: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]
PS:由于我们无法在RHS上使用%
变量作为反向引用,因此我在\1
中使用了特殊的正则表达式反引用变量RewriteCond
。
答案 1 :(得分:3)
这种情况不足:
RewriteCond %{REQUEUST_URI} !^(/resources/[^/]*/%{HTTP_HOST})(.*)$
因为如果我请求任何不以/resources/
开头的内容,我将收到403.php错误页面。你真正想要的是这样的:
RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/
RewriteCond %{HTTP_HOST} !%1
或
RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/
RewriteCond %{REQUEST_URI} !^/resources/[^/]+/%{HTTP_HOST}/
如果第一个条件是检查请求是针对资源的,那么第二个条件是检查主机。 HOWEVER ,这些都不会起作用,因为mod_rewrite的RewriteCond
指令不允许%变量或条件右侧的反向引用,只有左侧。同样,你也不能这样做:
RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/
RewriteRule !^/resources/[^/]+/%{HTTP_HOST}/ /error/403.php
因为RewriteRule的表达式中不能包含变量,因为它是一个正则表达式,它实际上需要%{HTTP_HOST}
而不是用请求中给出的主机替换它。总而言之,不,你不能用mod_rewrite的条件这样做。
如果您有权访问服务器配置或vhost配置,则可以尝试创建RewriteMap并传入%{REQUEST_URI}
和%{HTTP_HOST}
。因此,如果您的地图被称为check_host
,那么您的规则可能如下所示:
RewriteRule ^resources/[^/]+/([^/]+)/ ${check_host:%{HTTP_HOST}_%{REQUEST_URI}}
您的脚本只需要解析输入,将其从第一个_
拆分,解析请求URI并确保主机与HTTP_HOST相同。如果相同,则输出相同的请求URI,否则输出错误URI。如果您无法访问服务器或vhost配置,我认为您运气不好。无法在htaccess文件中定义RewriteMap。