Перенаправить указанный HTTPS-запрос на определенный порт с помощью Apache - PullRequest
0 голосов
/ 31 мая 2018

У меня проблема с перенаправлением какого-либо запроса на другой порт.Вот моя конфигурация:

  • У меня есть публичный домен, такой как XXXX.ddns.net
  • У меня есть Rapsbian сервер с apache и файлы в моих папках / var / www корректно обслуживаются (англоязычный веб-сайт)
  • На том же сервере Raspbian есть сервер REST, работающий на порту 3000
  • Он работает на HTTPS с SSL (letsencrypt)

Iхотел бы, чтобы все запросы к XXXX.ddns.net/api/* были перенаправлены на порт 3000.

Я изменяю файл .htaccess, и правило перезаписи работает на локальном, но я не могу сделатьэто работает с моего интернет-сайта.Запросы API достигают с ошибкой 500.

Вот мой текущий файл .htaccess:

RewriteEngine On
RewriteRule ^api/(.*)      https://localhost:3000/api/$1 [QSA]
# not sure if it should be http or https in the rule but nothing works
#RewriteRule ^api/(.*)      http://localhost:3000/api/$1 [QSA]

# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

# If the requested pattern is file and file doesn't exist, send 404
RewriteCond %{REQUEST_URI} ^(\/[a-z_\-\s0-9\.]+)+\.[a-zA-Z]{2,4}$
RewriteRule ^ - [L,R=404]

Вот мой текущий файл 000-default-le-ssl.conf (в / etc /apache2 / sites-available):

<IfModule mod_ssl.c>
<VirtualHost *:443>

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

ServerName XXXX.ddns.net
SSLCertificateFile /etc/letsencrypt/live/XXXX.ddns.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/XXXX.ddns.net/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
<Location /api>
        ProxyPass http://127.0.0.1:3000/api
        ProxyPassReverse http://127.0.0.1:3000/api
</Location>

</VirtualHost>
</IfModule>

Если кто-то может помочь мне достичь этого ... Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Ваше решение для себя выглядит странно для меня.Вы включаете SSLProxyEngine и затем отключаете все меры безопасности.Бэкэнд API работает под HTTPS и HTTP на порту 3000 одновременно?Это невозможно.

Я использую эту настройку (apache в качестве прокси-сервера для внутреннего приложения) довольно часто и предлагаю следующую конфигурацию:

Поскольку я не понимал назначение директив перезаписи, я их пропустил.VirtualHost на порту 80 всегда перенаправляет HTTP-запросы к HTTPS.Если это работает, добавьте permanent к директиве (постоянные кэшируются некоторыми браузерами, см. Комментарий в VirtualHost *: 80).

VirtualHost для HTTPS обслуживает контент из вашего DocumentRoot по адресу / var / www / html.Директива Directory заботится о том, чтобы обслуживались только правильно адресованные файлы (поиск невозможен).VirtualHost также предоставляет прокси для / api на том же сервере через порт 3000.

Он должен работать для apache 2.4, если ваша конфигурация letsencrypt правильная (заполните XXXX).Обе конфигурации VirtualHost могут быть записаны в один файл, обычно расположенный в / etc / apache2 / sites-available с символической ссылкой на / etc / apache2 / sites-enabled.Удалите / переименуйте ваш файл .htaccess и другие конфигурации перед тестированием этой конфигурации.Если вам нужно управление доступом через Apache, это также можно настроить непосредственно в конфигурации VirtualHost.

<VirtualHost *:80>
    ServerName XXXX.ddns.net
    # Always https
    Redirect / https://XXXX.ddns.net/
#    Redirect permanent / https://XXXX.ddns.net/
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName XXXX.ddns.net
    # These are your SSL settings; your responsibility
    SSLCertificateFile /etc/letsencrypt/live/XXXX.ddns.net/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/XXXX.ddns.net/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    # Your document root; where the JavaScript application lives
    DocumentRoot /var/www/html
    <Directory /var/www/html/ >
        Options -Indexes +FollowSymLinks -MultiViews
        AllowOverride None
        Order Allow,Deny 
        Allow From All
    </Directory>

    # Reverse proxy settings for api
    ProxyRequests     Off
    ProxyPreserveHost On
    <Location /api >
        ProxyPass        http://127.0.0.1:3000/api
        ProxyPassReverse http://127.0.0.1:3000/api
    </Location>
</VirtualHost>
0 голосов
/ 03 июня 2018

Спасибо за вашу помощь.Я не знаю как, но это работает сейчас!Я не помню точно, что я сделал, но последним было изменить мой файл 000-default-le-ssl.conf следующим образом:

SSLProxyEngine On
SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
<Location /api>
    ProxyPass http://127.0.0.1:3000/api/
    ProxyPassReverse http://127.0.0.1:3000/api/
    ProxyPass https://127.0.0.1:3000/api/
    ProxyPassReverse https://127.0.0.1:3000/api/
</Location>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...