Динамическое расположение NGINX для создания динамического og: image - PullRequest
2 голосов
/ 06 ноября 2019

Я разработал сайт, который показывает некоторые товары из магазина. URL-адрес сайта выглядит следующим образом:

http://testsite.com

Сайт имеет функцию совместного использования продукта (он уже работает), генерируя ссылку, которой можно поделиться на Facebook, WhatsApp или в любом другом месте. Ссылка на общий продукт:

http://testsite.com/product/1234

Где 1234 - идентификатор продукта. Все продукты имеют изображения с идентификатором. Пример: 1234.jpg. Ссылка на изображение идентификатора продукта 1234:

http://testsite.com/static/imgs/1234.jpg

Этот сайт размещен на простом сервере NGINX, который просто предоставляет файлы.

Во главе моего индекса. html файл У меня есть og: изображение по умолчанию для обмена:

<meta property="og:image" content="http://testsite.com/static/imgs/main.jpg">

Я хочу, чтобы сервер NGINX заменил это og: изображение по умолчанию на изображение с общим идентификатором. Я уже знаю, как это сделать в NGINX. В файле конфигурации NGINX (/etc/nginx/conf.d/default.conf) я использовал опцию sub_filter. Мой файл конфигурации NGINX:

server {
    listen       80;
    server_name *.testsite.com;
    root   /var/www/testsite.com/dist;

    location / {
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }

    location ~ /product/(.*) {
        index  index.html index.htm;

        try_files $uri $uri/ /index.html;

        sub_filter 'http://testsite.com/static/imgs/main.jpg'
        'http://testsite.com/static/imgs/$1.jpg';
        sub_filter_once on;
    }
}

Эта конфигурация работает для местоположения / , но для местоположения ~ /product/(.*) этоне работает.

Когда я проверяю параметр sub_fiter в расположении / , используя любое другое изображение, оно заменяет его правильно.

ВОПРОСЫ:

1) Как получить идентификатор продукта (1234) по URL-адресу (http://testsite.com/product/1234)? $ 1 не работает.

2) Iподумайте, что при входе в местоположение ~ /product/(.*) он также перенаправляет на местоположение / . Как я могу исправить этот файл конфигурации, чтобы он работал как положено?

1 Ответ

1 голос
/ 09 ноября 2019

Я думаю, что ваше alias утверждение является проблемой. Чтение в nginx документах:

location / i / {псевдоним / data / w3 / images /;}

по запросу «/i/top.gif» будет отправлен файл /data/w3/images/top.gif.

Это означает, что в вашем случаена каждый ~/product/(.*) запрос /var/www/testsite.com/dist/index.html будет отправляться без учета идентификатора продукта. Возможно, вы захотите настроить псевдоним на /, чтобы избежать этого. Это также может быть причиной того, что вы «перенаправлены» на /.

Что касается $ 1, он должен работать так, как он есть сейчас. Когда вы исправите alias, я думаю, что это будет работать тогда. Если нет, вы можете попробовать именованное совпадение: (?<product>[0-9]+) вместо (.*), тогда вы можете использовать переменную $product для ссылки на идентификатор.

В вашем коде есть еще одна небольшая ошибка - выдобавив дополнительные кавычки на замену. Второй аргумент для sub_filter - в кавычках дважды.


Рабочий пример

ОБНОВЛЕНИЕ: Хорошо, я установил его на localhost со следующей конфигурацией nginx (тестирование на "Hello World"):

        location ~ /product/(\d+)$ {
                set $product $1;
                try_files $uri $uri/ /index.html;
        }

        location / {
                if ( $product = '' ) {
                   set $search 'Non-Existent-String';
                }
                if ( $product != '' ) {
                   set $search 'World'; # the string you want to replace
                }

                index index.html index.htm;
                sub_filter '$search' 'Product #$product';
        }

Ключевым моментом здесь является то, что когда вы используете try_files, он достигает location /. Так что нам нужно sub_filter в /. Мы также не хотим подвергать sub_filter регулярные запросы /index.html. Что-то вроде if ($product) sub_filter было бы неплохо, но с nginx это невозможно. Поэтому я просто оставляю sub_filter, но задаю только строку поиска для запросов товаров.

Example

...