Назад | Перейти на главную страницу

Изменить URL-адрес для proxy_pass на основе заголовка

Есть несколько похожих вопросов, но они не решают мою проблему.

Я использую nginx в качестве прокси для cdn. Если браузер принимает webp в качестве формата изображения он должен использоваться, иначе оригинал.

Предполагается, что всегда есть myfilename.jpg и myfilename.jpg.webp (у меня есть запасной вариант, который генерирует изображения, если они не существуют).

Я делаю это отображение:

map $http_accept $webp_suffix {
    default   "";
    "~*webp"  ".webp";
}

А это конфиг nginx:

server {
    listen 80;
    server_name images.cdn.de;

    error_page 403 404 = /-;

    location /- {
        proxy_pass         http://web:8808;
        proxy_redirect     off;

        proxy_set_header   Host                 $host;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto    $scheme;
        proxy_set_header   X-Original-URI       $original_uri;
        proxy_read_timeout 600;
        internal;
    }


    location / {

      set $original_uri $uri$is_args$args;

      proxy_http_version     1.1;
      proxy_set_header       Host 's3.eu-central-1.amazonaws.com';
      proxy_set_header       Authorization '';
      proxy_hide_header      x-amz-id-2;
      proxy_hide_header      x-amz-request-id;
      proxy_hide_header      Set-Cookie;
      proxy_ignore_headers   "Set-Cookie";
      proxy_buffering        off;
      proxy_intercept_errors on;

      expires 1y;

      proxy_pass https://s3.eu-central-1.amazonaws.com/bucket/media/public/images/;
    }
  }

Идея состоит в том, что если изображение есть, то оно передается напрямую из s3. Если его там нет (в имени файла есть директивы обрезки), он сгенерирован web:8808 сервис на лету и загружается для последующих звонков на s3.

Это нормально.

Я хотел бы знать, как я могу добавить $webp_suffix (по умолчанию это пустая строка) на URL-адрес, переданный на прокси-сервер s3.

Вам необходимо переписать URI, если он заканчивается на .jpg. Вы можете просто добавить rewrite ... break заявление к location / блок.

Поскольку у вас есть URI, добавленный к proxy_pass директива, rewrite ... break вызовет обход любого псевдонима URI. Видеть этот документ для подробностей.

Чистым решением может быть всегда переписывать URI, а не полагаться на proxy_pass эффект сглаживания:

location / {
    rewrite \.jpg$ /neuraum/media/public/images$uri$webp_suffix break;
    rewrite ^ /neuraum/media/public/images$uri break;
    ...
    proxy_pass https://s3.eu-central-1.amazonaws.com;
}