nginx сопоставление списка URL-адресов из файла

эй, у меня есть около 5 тысяч URL-адресов для перенаправления. Я пытаюсь применить логику, определенную в этом сообщении stackoverflow однако после проверки файла конфигурации я получаю сообщение об ошибке;

2019/10/07 10:08:33 [emerg] 386#386: unknown "old_uri" variable
nginx: [emerg] unknown "old_uri" variable
nginx: configuration file /etc/nginx/nginx.conf test failed

Вот самые основные файлы из примера hello-world nginx, с которым я имею дело.

/etc/nginx/conf.d/default.conf

include /etc/nginx/conf.d/redirects.map;

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    if ($new_uri) {
    rewrite ^ $new_uri permanent;
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

redirects.map

map $old_uri $new_uri {
    default "";
    /about.html /about-us;
    /careers.html /awesome-careers;
}

/etc/nginx/nginx.conf


user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


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"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*;
}

Спасибо за помощь! Очень ценится


person quartaela    schedule 07.10.2019    source источник
comment
Нет переменной с именем $old_uri. Вы имеете в виду $request_uri?   -  person Richard Smith    schedule 07.10.2019
comment
Лол, я думал, что мы определяем URL-адреса, а nginx просто их разрешает. большое спасибо @RichardSmith, это сработало. Можете ли вы добавить ответ, чтобы я мог его принять.   -  person quartaela    schedule 07.10.2019


Ответы (1)


В вашем map переменная $old_uri не существует, вместо этого вы должны использовать $request_uri или $uri. См. этот ответ, чтобы узнать о разнице.

В блоке if используйте оператор rewrite, если вы хотите, чтобы исходная строка запроса была добавлена ​​к новому URI.

В противном случае используйте return 301 $new_uri;, если вы хотите, чтобы исходная строка запроса была отброшена.

person Richard Smith    schedule 07.10.2019
comment
большое спасибо! Все URL-адреса на самом деле являются статическими URL-адресами без каких-либо параметров запроса. Итак, в этом случае я должен использовать return 301 $new_uri; правильно? - person quartaela; 07.10.2019
comment
Оператор rewrite будет работать, но это излишество. Оператор return более эффективен. - person Richard Smith; 07.10.2019