Назад | Перейти на главную страницу

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

У нас есть https://example1.com/login и example2.com/login размещается на том же сервере Apache (2.2.22). Я хочу ограничить /login на example1.com.

Я попытался

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