переписывать / ограничивать конкретное доменное имя в apache

У нас есть 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 ?

3
задан 29 November 2016 в 19:10
1 ответ

Вы можете сделать это с помощью 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 ) будет более эффективным, поскольку это то, что обрабатывается в первую очередь.

0
ответ дан 3 December 2019 в 08:00

Теги

Похожие вопросы