nginx динамическое имя_сервера с переменной - PullRequest
0 голосов
/ 08 мая 2018

Уважаемое сообщество StackOverflow. Я работаю с третьей стороной, которая не поддерживает динамические запросы GET (например, example.com?variable=somethingDynamic), поэтому я перешел на использование пользовательских поддоменов, однако предпочитаю не создавать поддомен для каждый динамический запрос, поэтому мне было интересно:

как я могу написать имя_сервера таким образом, чтобы перехватывать две или три динамические переменные?

Вот мой пример серверного блока:

server {
    listen 80;
    server_name someSecretUrl_$variable1_$variable2.example.com;
    root /usr/share/campagins/campagin1;
    client_max_body_size 10000m;
    proxy_connect_timeout 30000;
    location /funnel_webhooks/test {
        return 200;
    }
    location / {
        if ($request_method = 'OPTIONS') {
            # Tell client that this pre-flight info is valid for 20 days
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            add_header 'Access-Control-Allow-Origin' "$http_origin" always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Etag,Last-Modified,HTTP_IF_MODIFIED_SINCE,HTTP_IF_NONE_MATCH' always;
            return 204;
        }
        add_header 'Access-Control-Allow-Origin' "$http_origin" always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Etag,Last-Modified,HTTP_IF_MODIFIED_SINCE,HTTP_IF_NONE_MATCH,ETag,Retry-After' always;
        add_header 'Access-Control-Expose-Headers' 'ETag,Retry-After' always;
        add_header 'Cache-Control' "must-revalidate, post-check=0, pre-check=0" always;
        rewrite ^(.*)$ $1?preMadeDataParsers=$variable1&preMadeDataParsersOnResponse=$variable2&$args break;
        proxy_buffering off;
        proxy_pass http://localhost:3000; #proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE_ADDR $remote_addr;
    }
}

Глядя на приведенный выше код, вы заметите, что я пытаюсь переместить $ variable1 в переменную GET и $ variable2 в другую переменную get, а как я могу добиться такого? спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

Я бы не стал делать это в nginx, я бы сделал это в вашем приложении. (Особенно, если вы планируете расширить этот ресурс.)

Я бы настроил сервер на прослушивание IP без каких-либо виртуальных хостов, чтобы он отвечал на любой запрос, сделанный к IP. Просто пропустите директиву server_name:

server {
    listen 1.2.3.4:80;
    ...

Затем настройте DNS с использованием символа подстановки, чтобы * .example.com указывал на этот IP-адрес. Теперь вы можете нажать any_string.example.com, и он будет преобразован в ваш IP-адрес, получит ответ от главного блока сервера и передан вашему приложению.

Затем, внутри вашего приложения, посмотрите, какое имя хоста было запрошено. (В PHP, например, это доступно через $_SERVER['HTTP_HOST'].) Если ваше приложение определяет, что запрошенное имя хоста неверно, просто введите 404 и выйдите. В противном случае декодируйте имя хоста и обработайте запрос.

Таким образом, вы можете добавлять новые переменные и новые функции без редактирования конфигурации nginx. Вы можете даже кодировать свои переменные в JSON, а затем BASE64 кодировать их:

$vars = [
    'var1' => 'one',
    'var2' => 'two',
    'var3' => 'three',
];
$url = base64_encode(json_encode($vars));

eyJ2YXIxIjoib25lIiwidmFyMiI6InR3byIsInZhcjMiOiJ0aHJlZSJ9.example.com

Теперь вы можете передавать любое количество переменных с любыми именами, включая индексированные и ассоциативные массивы. (Хотя обратите внимание, что есть ограничение на длину доменного имени, и вам придется что-то делать с символами + и /, которые, я уверен, недопустимы в доменных именах.)

...