Использование прокси-сервера nginx для обслуживания статического S3 в другом сегменте для таких ботов, как googlebot - PullRequest
1 голос
/ 14 мая 2019

Использование nginx для прокси субдоменов superduper.io в определенную папку в корзине S3.В корзине есть папка для каждого субдомена, которая содержит статический HTML-сайт.

Теперь я хочу перенаправить ботов в другую корзину S3.Что мне нужно добавить в мой файл nginx.conf?

worker_processes auto;
# include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
    server {
        listen 80;
        server_name *.superduper.io;
        access_log /var/log/nginx/superduper.access.log;
        error_log /var/log/nginx/superduper.error.log;

        location / {
            resolver 8.8.8.8;
            set $bucket "https://superduper-spa.s3.us-east-1.amazonaws.com:443";
            rewrite ^([^.]*[^/])$ $1/ permanent;

            # matches: subdomain.superduper.io
            if ($host ~ ^([^.]*)\.superduper\.io) {
                set $subdomain $1;
                proxy_pass https://$bucket/${subdomain}${uri};
            }

            proxy_intercept_errors on;
            proxy_redirect off;
            proxy_set_header Host $bucket;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_hide_header x-amz-id-2;
            proxy_hide_header x-amz-request-id;
        }
    }

    # include /etc/nginx/conf.d/*.conf;
    # include /etc/nginx/sites-enabled/*;
}

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Поскольку nginx не поддерживает оператор else и if с более чем одним условием, может быть сложно написать определенные конфигурации, которые зависят от нескольких переменных.

Для вашего варианта использования есть два улучшения для потенциального решения, которые можно использовать как вместе, так и отдельно:

  • Возможно, вы захотите преобразовать свои существующие if с регулярным выражением около $host в именованный захват в server_name согласно http://nginx.org/r/server_name. Таким образом, вы ' Тогда вы сможете свободно использовать любое преобразование, которое вам требуется, около $http_user_agent сопоставления с ботами, например, с помощью оператора if, больше похожего на фактическое условие, чем просто для захвата субдомена.

    -server_name *.example.su;
    -if ($host ~ ^([^.]*)\.example\.su$) {
    -       set $subdomain $1
    -}
    +server_name ~^(p<subdomain>[^.]*)\.example\.su$;
    
  • Возможно, вы захотите использовать http://nginx.org/r/map.. Позволяет отобразить любые входы на выход. Вы можете объединить совпадения для $host и $http_user_agent, чтобы выполнить преобразование.

    map $http_host/$http_user_agent $bucket {
        "~^(p<subdomain>[^.]*)\.example\.su.*bot.*$"    $bucketPrefix/$subdomain/bot;
        "~^(p<subdomain>[^.]*)\.example\.su.*$" $bucketPrefix/$subdomain;
        default             $bucketPrefix;
    }
    server {
        …
            proxy_pass $bucket$uri;
    }
    
1 голос
/ 20 мая 2019

Альтернативным решением было бы использовать Cloudfront перед S3, а затем использовать функцию Lamdbda at edge для перенаправления определенных пользовательских агентов в другое ведро без необходимости касаться nginx.

...