.htaccess перезаписывает секунду, когда URI не содержит домена


Я поискал в 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}

Может ли кто-нибудь помочь мне с этими условиями?

Буду признателен за любую помощь.

Author: gion_13, 2012-06-17

2 answers

Это потрясающий вопрос, и если бы я мог, я бы проголосовал более 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 здесь.

 11
Author: anubhava, 2012-06-18 03:41:42

Этого условия недостаточно:

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}/

Где первое условие - проверка того, что запрос относится к ресурсу, затем второе - проверка хоста. ОДНАКО ни один из них не будет работать, потому что директива mod_rewrite RewriteCond не позволяет % переменные или обратные ссылки в правой части условия, только слева. Аналогично, вы также не можете этого сделать:

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

Потому что выражение перезаписывающего элемента не может содержать переменных, так как это регулярное выражение, и оно буквально ожидает %{HTTP_HOST} вместо замены его хостом, указанным в запросе. Итак, в заключение, нет, вы не можете сделать это с условиями mod_rewrite таким образом.

Что-то, что вы можете попробовать, если у вас есть доступ к конфигурации сервера или конфигурации vhost, - это создать aПереписать карту и передать как %{REQUEST_URI}, так и %{HTTP_HOST}. Поэтому, если ваша карта называется check_host, то ваше правило может выглядеть примерно так:

RewriteRule ^resources/[^/]+/([^/]+)/ ${check_host:%{HTTP_HOST}_%{REQUEST_URI}}

И вашему сценарию просто нужно будет проанализировать входные данные, разделить их с первого _, проанализировать URI запроса и убедиться, что хост совпадает с HTTP_HOST. Если это то же самое, выведите тот же URI запроса, в противном случае выведите URI ошибки. Если у вас нет доступа к конфигурации сервера или vhost, я думаю, вам не повезло. Перезаписать карту нельзя определено в файле htaccess.

 3
Author: Jon Lin, 2012-06-17 08:41:18