У нас есть https://example1.com/login
и example2.com/login
, размещен на том же сервере Apache (2.2.22). Я хочу ограничить / войти
на example1.com
.
example1.com/login
-> 404 (желательно) или 403
example2.com/ вход
-> страница входа
Я пробовал
<Location /login>
Order Deny,Allow
Deny from example1.com
Allow from example2.com
</Location>
Он отключает / login
как на example1.com
, так и на example2.com
. Могу ли я ограничить только example1.com
?
Вы можете сделать это с помощью mod_rewrite, который позволяет вам проверять хост , через который осуществляется доступ к сайту. Попробуйте следующее в конфигурации вашего сервера (или раздел
или файл .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]
Заказ запретить, разрешить Запретить с example1.com Разрешить с example2.com Он отключает
/ login
как наexample1.com
, так и наexample2.com
.
Мне довольно любопытно ... это, казалось бы, разрешить любой доступ, а не запретить? Запретить ...
Директива запрещает доступ пользователю с example1.com
(через обратный поиск DNS по удаленному IP-адресу), а не пользователю, который обращается к хосту example1.com
. Ни одна из директив Deny
или Allow
не должна совпадать, поэтому она должна использоваться по умолчанию 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-адреса и использовать флаг ИЛИ
. Например:
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
) будет более эффективным, поскольку это то, что обрабатывается в первую очередь.