Перенаправить URL Elastic Beanstalk на доменное имя

У меня есть приложение, размещенное на AWS Elastic Beanstalk, которому назначен URL-адрес среды как таковой:

<my-appname>.<aws-region>.elasticbeanstalk.com

Я также зарегистрировал доменное имя как таковое:

my-appname.com

В AWS Route 53 у меня есть A ALIAS, указывающий my-appname.com на среду EB как таковую:

my-appname.com > A ALIAS <my-appname>.<aws-region>.elasticbeanstalk.com

У моего регистратора есть серверы имен Route 53, настроенные для управления DNS через Amazon.

Все работает нормально

Я хотел бы понять, как сделать так, чтобы любые запросы к домену <my-appname>.<aws-region>.elasticbeanstalk.com> поступали 301 в домен my-appname.com.

В настоящее время я использую Apache RewriteRule для перенаправления всех запросов без www на версию веб-сайта с www, используя это в файле .config:

<If "'%{HTTP_HOST}' !~ /^www\./">
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</If>

Было бы хорошей практикой просто заменить HTTP_HOST на my-appname.com?

Обновлено: этот подход все равно не работает. Не уверен, почему?

<my-appname>.<aws-region>.elasticbeanstalk.com> — это просто удобный URL-адрес, который Amazon создает, чтобы вам было проще тестировать и идентифицировать приложения по имени, а не по Env. Я БЫ. Как правило, их не следует публиковать, поскольку они являются субдоменами, над которыми вы, как клиент AWS, не имеете полномочий или контроля. Я не думаю, что Env. URL-адрес можно изменить после создания приложения. Однако вы можете клонировать его, создать новый URL-адрес, который вы держите в секрете, обновить необходимые конфигурации в Route53, а затем закрыть исходное приложение, навсегда уничтожив этот URL-адрес.
dusthaines 22.07.2019 19:44

Меня беспокоило то, что если URL-адрес станет общедоступным (случайно или по неосведомленности), это станет головной болью SEO. Я думаю, что правил перезаписи сервера должно быть достаточно, например Rewrite Cond %{HTTP_HOST} !~ my-appname.tld

alphazwest 24.07.2019 14:32
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
4
2
1 684
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Насколько я понимаю, лучшим подходом для этого является использование перезаписей на уровне сервера для решения проблемы. Пример (для сервера Apache) выглядит следующим образом:

Rewrite Engine On

# Catch requests to domains other than your primary (custom) domain
Rewrite Cond %{HTTP_HOST} !~ appname.tld

# Send those requests to the primary domain
RewriteRule (.*) http://www.appname.tld%{REQUEST_URI} [R=301, L]

При использовании Elastic Beanstalk (Amazon Linux 2) и Nginx у вас есть два решения:

Расширение Elastic Beanstalk по умолчанию nginx.conf

Создайте файл с именем .platform/nginx/conf.d/redirections.conf внутри исходного кода, который содержит:

server {
    server_name .elasticbeanstalk.com;
    return 301 https://example.com$request_uri;
}

Документация Nginx: https://www.nginx.com/blog/creating-nginx-rewrite-rules/

(example.com — ваш собственный домен)

Создайте свой собственный nginx.conf, который заменит файл по умолчанию из Elastic Beanstalk.

  • Скопируйте содержимое из оригинала /etc/nginx/nginx.conf, подключившись к своему экземпляру Elastic Beanstalk EC2 с помощью SSH (*)
  • Создайте файл с именем .platform/nginx/nginx.conf внутри исходного кода и вставьте его содержимое.
  • Измените его в соответствии с вашими потребностями и добавьте:
server {
    server_name .elasticbeanstalk.com;
    return 301 https://example.com$request_uri;
}

В итоге у вас должен получиться /etc/nginx/nginx.conf (взято из Amazon Linux 2 по состоянию на 08.09.2020), который выглядит следующим образом:

# Elastic Beanstalk Nginx Configuration File

user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    32136;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        default     "upgrade";
    }

    server {
        listen        80 default_server;
        access_log    /var/log/nginx/access.log main;

        client_header_timeout 60;
        client_body_timeout   60;
        keepalive_timeout     60;
        gzip                  off;
        gzip_comp_level       4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
    }

    # ADDED
    server {
        server_name .elasticbeanstalk.com;
        return 301 https://example.com$request_uri;
    }
}


Подробнее о настройке Nginx

При этом я также рекомендую другие модификации вашей конфигурации Nginx.

Перенаправление с www на корень

Пример с перенаправлением www.example.com на example.com.

# .platform/nginx/conf.d/redirections.conf

# https://stackoverflow.com/a/43089681
# https://tribulant.com/docs/hosting-domains/hosting/9867/redirecting-to-www-or-non-www/
# This can be done at the load balancer level but I prefer to do it here
# Test this with `curl --head https://www.example.com` and `curl --head http://www.example.com`
server {
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

Предпосылки:

  • Диспетчер сертификатов AWS (ACM): создайте один сертификат для example.com и www.example.com.
  • Маршрут 53: создайте записи A для example.com и www.example.com, которые направляют к балансировщику нагрузки.

Заголовки безопасности HTTP

Я рекомендую установить эти заголовки HTTP для безопасности:

# .platform/nginx/conf.d/security_headers.conf

# Remove Nginx version in error page and header
server_tokens off;

# Security headers thanks to https://observatory.mozilla.org/ and https://webpagetest.org/
# Inspired by https://www.mozilla.org/ HTTP headers
# https://gist.github.com/plentz/6737338
# https://github.com/GetPageSpeed/ngx_security_headers
add_header Content-Security-Policy "default-src 'self';
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";

Сжатие файлов (.js, .css, .html...)

Вы можете включить сжатие с помощью gzip on;. К сожалению вы не можете расширить nginx.conf по умолчанию, чтобы включить сжатие. Вам придется скопировать-вставить и изменить оригинальный nginx.conf (.platform/nginx/nginx.conf).

Примечание: вы можете иметь свой собственный .platform/nginx/nginx.conf и по-прежнему использовать файлы внутри каталога .platform/nginx/conf.d/.

Перенаправить HTTP на HTTPS

2 решения: используйте балансировщик нагрузки (Application Load Balancer) или пользовательский .platform/nginx/nginx.conf.

# .platform/nginx/nginx.conf

...

    server {
        listen        80 default_server;

        ...

        # ADDED
        # [AWS documentation - Configuring HTTP to HTTPS redirection](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html)
        # https://github.com/awsdocs/elastic-beanstalk-samples/blob/9720e38e9da155752dce132a31d8e13a27364b83/configuration-files/aws-provided/security-configuration/https-redirect/nodejs/https-redirect-nodejs.config#L61
        # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto
        if ($http_x_forwarded_proto = "http") {
            return 301 https://example.com$request_uri;
        }

        ...
    }

...




(*) Откройте порт 22 в группе безопасности экземпляра EC2 (что-то вроде *AWSEBSecurityGroup*), затем перейдите по адресу:

EC2 > Instances > Connect > EC2 Instance Connect (подключение SSH через браузер)

Другие вопросы по теме