mod_rewrite с http-порта XXXX на https-порт XXXY

Я не могу заставить mod_rewrite работать со следующими правилами.

RewriteCond "%{SERVER_NAME}" "home.myhome.net"
RewriteCond "%{SERVER_PORT}" "^4388$"
RewriteRule (.*) https://home.myhome.net:4389%{REQUEST_URI} [QSA,R=301,L]

Это правило установлено на моем виртуальном хосте http раздел. Проблема в том, что перенаправление работает только в первый раз. Во второй раз, когда я ввожу другой URL-адрес на http-порт 4388, меня перенаправляют на https : //home.myhome.net: 438 8 / ...

, например :

Есть идеи, как это исправить?

Сведения о моей ОС:

root@host:~# dpkg -l|grep apache
ii  apache2                                     2.4.18-2ubuntu3.5                            amd64        Apache HTTP Server
ii  apache2-bin                                 2.4.18-2ubuntu3.5                            amd64        Apache HTTP Server (modules and other binary files)
ii  apache2-data                                2.4.18-2ubuntu3.5                            all          Apache HTTP Server (common files)
ii  apache2-utils                               2.4.18-2ubuntu3.5                            amd64        Apache HTTP Server (utility programs for web servers)
ii  python-certbot-apache                       0.17.0-1+ubuntu16.04.1+certbot+1             all          Apache plugin for Certbot
root@host:~# lsb_release -d
Description:    Ubuntu 16.04.3 LTS

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

<VirtualHost *:80>
    ServerAdmin webmaster@myhome.net
    DocumentRoot /var/www/html

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond "%{SERVER_NAME}" "home.myhome.net"
        RewriteCond "%{SERVER_PORT}" "^4388$"
        RewriteRule ^ https://%{SERVER_NAME}:4389%{REQUEST_URI} [noescape,qsappend,redirect=301,last]
    </IfModule>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

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

EDIT : Хорошо, я кое-что нашел, но решения тоже нет: Я сравнил первый и следующий запрос / ответ браузера с инструментами разработчика браузера -> вкладка сети:

Первый запрос дал мне « 301 перемещен навсегда », но следующий запрос дает мне « 307 Internal Redirect ".

Так что это похоже на проблему с сервером. Вопрос только в том, что это ошибка в mod_rewrite или это моя вина, потому что правило не подходит.

РЕДАКТИРОВАТЬ : Я тестировал сейчас также с текущей версией apache 2.4.27-5.1 + ubuntu16.04.1 + deb.sury.org + 1 из Apache PPA Ондржея Сури

С уважением, 23 в вызове хоста правильно возвращает внутренний адрес 10.x.

Это все еще кажется немного хрупким, потому что сервер имен, назначенный DHCP, может измениться ...

4
задан 26 September 2017 в 13:41
1 ответ

В VPC используйте 169.254.169.253 .

Это то же самое, что и использование адреса CIDR base + 2, назначенного DHCP, но более переносимого, поскольку это не зависит от IP-нумерации VPC, в котором будет развернута машина. Вы можете развернуть ту же конфигурацию в любом VPC в любом регионе AWS, и этот адрес всегда будет рабочим внутренним преобразователем DNS.

Если [ enableDnsSupport ] истинно, запросы к DNS-серверу, предоставленному Amazon, на 169.254.169.253 IP-адрес или зарезервированный IP-адрес на основе диапазона сети VPC IPv4 плюс два будут успешными.

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-dns. html # vpc-dns-support

Для экземпляров в EC2-Classic, даже если DNS-преобразователь предоставляется DHCP, он никогда не изменяется. Это всегда 172.16.0.23.

Amazon предоставляет DNS-сервер, который преобразует предоставленные Amazon имена хостов IPv4 DNS в адреса IPv4. В EC2-Classic сервер Amazon DNS расположен по адресу 172.16.0.23 .

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html # amazon-dns-server

11
ответ дан 3 December 2019 в 02:32

Теги

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