.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}
Может ли кто-нибудь помочь мне с этими условиями?
Буду признателен за любую помощь.
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
здесь.
Этого условия недостаточно:
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.