У нас есть https://example1.com/login
и example2.com/login
размещается на том же сервере Apache (2.2.22). Я хочу ограничить /login
на example1.com
.
example1.com/login
-> 404 (желательно) или 403
example2.com/login
-> страница входа
Я попытался
<Location /login>
Order Deny,Allow
Deny from example1.com
Allow from example2.com
</Location>
Это отключает /login
от обоих example1.com
и example2.com
. Могу ли я ограничить только example1.com
?
Вы можете сделать это с помощью mod_rewrite, который позволяет вам проверить хозяин через который осуществляется доступ к сайту. Попробуйте следующее в конфигурации вашего сервера (или <Directory>
раздел или .htaccess
файл):
RewriteEngine On
RewriteCond %{HTTP_HOST} =example1.com [NC]
RewriteRule ^/?login$ - [R=404,L]
Вышеупомянутое обслуживает 404 Not Found, если вы запрашиваете example1.com/login
, но ничего не будет делать, если вы запросите example2.com/login
(запрос будет просто пропущен).
В =
префикс на RewriteCond
CondPattern делает его точным лексикографическим сравнением, а не регулярным выражением, поэтому нет необходимости экранировать точку или использовать якоря.
Чтобы вместо этого подать 403 Forbidden, вы можете изменить флаги на RewriteRule
, например:
RewriteRule ^/?login$ - [F]
<Location /login> Order Deny,Allow Deny from example1.com Allow from example2.com </Location>
Это отключает
/login
от обоихexample1.com
иexample2.com
.
Мне довольно любопытно ... это казалось бы позволять весь доступ, не отрицать? В Deny from ...
директива запрещает доступ пользователю из example1.com
(через обратный поиск DNS на удаленном IP-адресе), а не пользователя, который обращается к example1.com
хост. Ни Deny
или Allow
директивы должны совпадать, поэтому он должен быть по умолчанию Позволять. (?)
... как мне добавить несколько условий перезаписи для одного и того же RewriteCond?
ОБНОВИТЬ: Обратите внимание, что RewriteCond
директивы (т.е. условия) относятся к синглу RewriteRule
следующая директива. Продолжая приведенный выше пример, если вы хотите заблокировать несколько URL-адресов (например, /login
, /demo
и /test
) для example1.com
только тогда вы можете объединить все это в RewriteRule
шаблон. Например:
RewriteCond %{HTTP_HOST} =example1.com [NC]
RewriteRule ^/?(login|demo|test)$ - [R=404,L]
В данном случае это нормально, так как URL-адреса ограничены и все очень короткие. В качестве альтернативы вы можете создать условие для каждого URL-адреса и использовать OR
флаг. Например:
RewriteCond %{HTTP_HOST} =example1.com [NC]
RewriteCond %{REQUEST_URI} ^/login$ [OR]
RewriteCond %{REQUEST_URI} ^/demo$ [OR]
RewriteCond %{REQUEST_URI} ^/test$
RewriteRule ^ - [R=404,L]
Это означает ... для всех URL-адресов, где HTTP_HOST
является example1.com
и URL либо /login
или /demo
или /test
затем подайте документ об ошибке 404. Однако первый пример (с использованием RewriteRule
шаблон) будет более эффективным, так как это то, что обрабатывается в первую очередь.