Apache RewriteRule — все, кроме localhost и loopback

У меня есть сервер, с которым я хочу обеспечить связь https из внешнего мира, однако на сервере есть службы, к которым необходимо получить доступ через http процессами на локальном сервере.

Я пробовал следующее:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}

Но, конечно, службы, работающие на локальном сервере, не могут быть доступны через http. Как применить https для всего, кроме localhost и 127.0.0.1? Или, если проще, у меня есть 2 внешних домена для этого сервера - как мне заставить https только для http://sub1.domain1.suffix1 и http://sub2.domain2.suffix2 и внешний IP-адрес сервера?


person tarun713    schedule 08.10.2015    source источник
comment
пожалуйста, приведите пример службы с 127.0.0.1, я делаю много запросов на основе сервера на сайте https/ssl, но все они просто запрашивают через lynx страницу на сайте. Я не понимаю, какое дело будет связано с тем, о чем вы говорите. Если два домена запускаются через apache vitualhosts, в обычном случае вы будете настраивать https для каждого домена, а не для сервера, если только у вас нет глобального сертификата для всех поддоменов домена1 или домена2.   -  person Lizardx    schedule 09.10.2015
comment
Я размещаюсь на Windows Azure через виртуальную машину, поэтому у меня есть 2 домена — один, предоставленный azure (thedomain.cloudapp.net), и тот, для которого у меня есть сертификат SSL (mysub.mydomain.com). Никто не должен использовать домен cloudapp.net, но если они это сделают, я хочу убедиться, что правильно перенаправляю их на реальный домен SSL. Я запускаю mediawiki с сервером parsoid, расположенным на коробке. Parsoid доступен только через локальный компьютер, но является веб-службой, и mediawiki настроен на доступ к нему через localhost.   -  person tarun713    schedule 09.10.2015


Ответы (3)


Попробуйте это, я не уверен, что это сработает, но может, я никогда не имел дело с фактическим значением «localhost».

RewriteEngine On
RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://mysub.mydomain.com/$1 [R=301,L]

ОБНОВЛЕНИЕ 2: я подумал об этом и понял, что это не подходит для этого случая: https://mysub2.mydomain.com/ перенаправить на https://mysub.mydomain.com/ — прежде чем добавлять это, проверьте этот URL и посмотрите, перенаправляет ли он первое правило или нет, если нет, протестируйте вместо этого второй набор правил.

Чтобы исправить этот случай, попробуйте:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} mysub2.mydomain.com [NC]
RewriteRule ^/?(.*) https://mysub.mydomain.com/$1 [R=301,L]

Объяснение UPDATE2, если оно работает:

Сделайте тест более сложным, теперь перезапись происходит, если не localhost/127.0.0.1, тогда тест не https ИЛИ mysub2.mydomain.com (или любые другие домены/поддомены на сервере, на который вы хотите перенаправить: https://mysub.mydomain.com

= ОБНОВЛЕНИЕ объяснения:

Это довольно простой набор правил. Мы создаем 3 условия, которые должны быть выполнены для применения правил перезаписи. Чтобы быть в безопасности, я использую ^ по привычке, т.е. это то, с чего он начинается, так что это говорит о том, что имя хоста/IP не начинается с localhost/127.0.0.1. ! значит нет.

  1. Имя хоста не является localhost (имя хоста — это то, что вы вводите в браузере для доступа к странице, или имя, которое вы используете для доступа к ней через веб-службу). Поскольку доменные имена не чувствительны к регистру, я добавил флаг [NC], что означает «без учета регистра», т. е. без учета регистра. Это тот, который я не был уверен, будет работать:

    RewriteCond %{HTTP_HOST} !^localhost [NC]

  2. IP-адрес удаленного запроса не 127.0.0.1

    RewriteCond %{REMOTE_ADDR} !^127.0.0.1$

  3. https уже не включен

    RewriteCond %{HTTPS} !=on

Затем фактическое правило перезаписи, которое срабатывает, если выполняются эти три условия. Перепишите все URL-адреса, кроме начального /, возьмите все в этом URL-адресе (.*), который не включает доменное имя, и добавьте его после https://mysub.mydomain.com/, затем выполните постоянную переадресацию 301 на полученный полный URL-адрес. ? означает 0 или 1. (.*) означает: поместить все после запуска / или без запуска / в $1, каждый (...) в правиле помещается в переменные $1, $2 и т.д.

RewriteRule ^/?(.*) https://mysub.mydomain.com/ $1 [R=301, л]

=КОНЕЦ обновления

Ваша настройка не полностью интуитивно понятна для меня, для меня, но если предположить, что на сервере есть только один фактический домен, который вы хотите обрабатывать запросы, то это, я думаю, сработает, а не положительно, учитывая некоторые функции, которые я не знаком с участием.

Для редиректа на https все три условия должны быть истинными, то есть не local/127 и https не включен.

person Lizardx    schedule 08.10.2015
comment
Это сделало это! Большое Вам спасибо. Если у вас есть несколько минут, объяснить, почему это работает, тоже было бы очень полезно. - person tarun713; 09.10.2015
comment
О, это сработало, это хорошо, я не был уверен из-за вашей установки. Это довольно просто, я обновлю ответ, чтобы объяснить это. - person Lizardx; 09.10.2015
comment
Теперь, когда я думаю об этом, вы, вероятно, можете удалить условие локального хоста, потому что REMOTE_ADDR будет 127.0.0.1 для локального хоста, но я хотел быть уверенным, так как я никогда не имел дело с этим сценарием. Но иметь его там не помешает, и если вдруг локальный хост станет не 127.0.0.1, вы все равно будете защищены. - person Lizardx; 09.10.2015

Попробуй это:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
person RyanT    schedule 28.01.2018

Это немного другой случай, но если у вас есть прокси-сервер перед вашим сервером, например, балансировщик нагрузки, вы можете сделать это (именно то, что предлагает AWS для перенаправления на TLS, находясь за ELB), что я подумал, что это своего рода круто, как только я понял, что если я этого не сделаю, моя конфигурация также перенаправит локальный хост:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
person Alexi    schedule 20.12.2018