Блог Синявского
  • Разделы
  • Метки
  • Все статьи

lighttpd https to http redirect rewrite

1

Как известно, когда сайт использует https, нельзя загружать содержимое с других сайтов, поэтому очень часто в проектах нужно загружать какие-то данные используя прокси. В lighttpd 1.4 есть некоторые ограничения, которые необходимо героически преодолевать. Например: необходимо, чтобы при запросе https://www.mapsite.com/tiles/13/6666/9999.png отдавались данные http://tile.osm.org/13/6666/9999.png.

Выполняется два преобразования:

  1. /tiles/13/6666/9999.png => /13/6666/9999.png

  2. /13/6666/9999.png => http://tile.osm.org/

В nginx ...

... это делается очень очень просто.

Описываем прокси backend и хранилище:

proxy_cache_path  /var/www/cache levels=1:2 keys_zone=openstreetmap-backend-cache:8m max_size=500000m inactive=1000d;

upstream openstreetmap_backend {
    server  a.tile.osm.org;
    server  b.tile.osm.org;
    server  c.tile.osm.org;
}

Внутри секции сервер:

server {
    listen...

    location /tiles/ {
        rewrite ^/tiles/(.+)$ /$1;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X_FORWARDED_PROTO http;
        proxy_set_header Host $http_host;
        proxy_cache openstreetmap-backend-cache;
        proxy_cache_valid  200 302  30d;
        proxy_cache_valid  404      1m;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://openstreetmap_backend;
            break;
        }
    }

    ...
}

В lighttpd v1.4 ...

... по-джедайски.

server.modules += ("mod_proxy")

$HTTP["host"] =~ "^(.+\.)?(mapsite\.com)" {
    accesslog.filename = "/web/<project_name>/logs/access.log"

    $HTTP["host"] == "mapsite.com"{
        url.redirect = ( "/(.*)" => "https://www.mapsite.com/$1" )
        url.redirect-code = 301
    }

    $SERVER["socket"] == ":81" {
        url.rewrite-once = ( "^/tiles/(.*)$" => "/$1" )
        proxy.balance = "round-robin"
        proxy.server  = ( "" => (
            "a.tile.osm.org" => (
                 "host" => "130.193.62.73"
            ),
            "b.tile.osm.org" => (
                 "host" => "130.193.62.73"
            ),
            "c.tile.osm.org" => (
                 "host" => "130.193.62.73"
            ),
        )
        )
    }

    $SERVER["socket"] == ":443" {
        ssl.engine = "enable"
        ssl.pemfile = "/etc/lighttpd/certificates/<project_name>.pem"

        $HTTP["host"] == "mapsite.com"{
            url.redirect = ( "/(.*)" => "https://www.mapsite.com/$1" )
            url.redirect-code = 301
        }

        $HTTP["host"] == "www.mapsite.com" {
            url.rewrite-once = (
                "^/favicon.ico$" => "/images/favicon.ico",
                "^/tiles/(.*)$" => "/tiles/$1"
            )

            $HTTP["url"] =~ "^/tiles/" {
                proxy.server = ( "" => ( "" => (
                        "host" => "127.0.0.1",
                        "port" => 81
                    )
                )
                )
            }
        }
    }
}

Здесь мы поднимаем еще один сокет на 81 порту. Это делается потому, что для исходного запроса мы уже сделали один url rewrite-once на 443 порту и поэтому приходится выкручиваться таким образом.

Важно! При проксировании на несколько серверов в параметре host нельзя использовать доменное имя, это вызывет ошибку, lighttpd не умеет резолвить доменные имена.

В lighttpd v1.5 и выше

Все настраивается согласно официальной документации

proxy-core.rewrite-request : rewrite request headers or request uri

$HTTP["url"] =~ "^/path1" {
  proxy-co...

  proxy-core.rewrite-request = (
    "_uri" => ( "^/path1/?(.*)" => "/$1" ),
    "Host" => ( ".*" => "server2.com" ),
  )
}


  • ← сюда
  • туда →

comments powered by Disqus

Опубликовано

28.09.2014

Обновление

05.05.2022

Категории

lighttpd

Тэги

  • lighttpd 7
  • request 3

Всегда на связи

  • Блог Синявского - Ничего не переносить на завтра, это тоже проблема с прокастинацией?
  • © Алексей Синявский, по лицензии CC BY-SA если не указано иное.
  • С использованием Pelican. Тема: Elegant от Talha Mansoor