Как заменить символы в переменной переменной nginx? - PullRequest
0 голосов
/ 06 сентября 2018

Есть ли способ заменить не алфавитно-цифровые символы, возвращаемые на $request_uri, пробелом (или +)?

Я пытаюсь перенаправить все 404 на одном из моих сайтов в поисковую систему, где запросом является uri. Итак, у меня есть блок в моем nginx.conf, содержащий:

error_page 404 = @notfound;
location @notfound {
    return 301 $scheme://$host/?s=$request_uri;
}

Хотя это действительно работает, URL-адрес, который он возвращает, является фактическим uri с -_/ символами, в результате чего поиск всегда возвращает 0 результатов

Например ... дать этот URL: https://example.com/my-articles, перенаправление заканчивается так: https://example.com/?s=/my-articles

То, что я хотел бы, это закончить (в конечном итоге) так: https://example.com/?s=my+articles (хотя + в начале тоже отлично работает ... https://example.com/?s=+my+articles

Мне нужно будет сделать это без модулей LUA или Perl. Итак, как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Возможно, вам придется настроить это в зависимости от того, насколько далеко вы хотите заместить структуру каталогов, но это основная концепция.

Именованное место для первоначального захвата 404 с:

location @notfound {
  rewrite (.*) /search$1 last;
}

Именованные местоположения немного ограничивают, поэтому все, что нужно сделать, это добавить /search/ в начало URI, который возвратил 404. Флаг last указывает Nginx выйти из текущего местоположения и выбрать лучшее местоположение для обработки. запрос основан на переписанном URI, поэтому нам нужен блок, чтобы перехватить это:

location ^~ /search/ {
  internal;
  rewrite ^/search/(.*)([^a-z0-9\+])(.*)$ /search/$1+$3 last;
  rewrite ^/search/(.*)$ /?s=$1 permanent;
}

Директива internal делает это местоположение доступным только для самого процесса Nginx, любые клиентские запросы к этому блоку возвращают 404.

Первая перезапись изменит последний не текстовый, цифровой или + символ на +, а затем попросит Nginx пересмотреть переписанный URI.

Блок местоположения определяется с помощью модификатора ^~, что означает, что запросы, соответствующие этому местоположению, не будут оцениваться для каких-либо блоков местоположения, определенных регулярным выражением, поэтому этот блок должен продолжать переписывать переписанные запросы.

Как только все несловарные символы пропадут, первая перезапись больше не будет совпадать, поэтому запрос будет передан следующей перезаписи, которая удалит /search с начала URI и добавит строку запроса.

Мои журналы выглядят так:

>> curl -L -v http://127.0.0.1/users-forum-name.1
<<  "GET /?s=users+forum+name+1 HTTP/1.1"

>> curl -L -v http://127.0.0.1/users-forum-name/long-story/some_underscore
<< "GET /?s=users+forum+name+long+story+some+underscore"

Вы поняли идею ..

0 голосов
/ 17 сентября 2018
  1. Обычно плохая идея автоматически создавать перенаправления со страниц 404 Not Found в другое место - пользователь мог просто набрать один символ в URL (например, на мобильном телефоне во время копирования URL).от летчика и «толстого пальца»), который было бы очень легко исправить, когда они увидят 404 и очевидную опечатку в адресной строке, но, возможно, потребуется начать с нуля, если ваша поисковая система не доставит.

  2. Если вы все еще хотите это сделать, возможно, будет более эффективным сделать это в самой поисковой системе - в конце концов, если ваша поисковая система не способна выполнять поиск по URL-адресу, иисправляя опечатки, тогда это не похоже на очень полезную поисковую систему, не так ли?

  3. Если вы все еще хотите сделать это внутри nginx перед поисковой системой,тогда вы можете использовать тот факт, что директивы http://nginx.org/r/rewrite, по сути, позволяют вам реализовать любой вид DFA - Детерминированный конечный автомат - но, в зависимости от количестватребуемых замен, это может привести к слишком большому числу циклов и несколько негибких наборов правил.

    Посмотрите следующие ресурсы по рекурсивным заменам данных символов в URL-адресе для других символов:

0 голосов
/ 12 сентября 2018

Вы можете использовать модуль lua, преобразовать эту переменную в то, что вам нужно, используя строковые функции lua. Я использую OpenResty, который по сути является nginx с включенным lua. Но модуль nginx lua подойдет. Вот директива, которая позволяет вам использовать lua внутри конфигурации nginx. Это может быть внутреннее местоположение, используя content_by_lua_block / access_by_lua_block или в отдельном файле, используя content_by_lua_file / access_by_lua_file. Вот документация по этому https://github.com/openresty/lua-nginx-module#content_by_lua. Вот пример из моего приложения.

location ~/.*\.jpg$ {

  set $test '';
  access_by_lua_block {

    ngx.var.test = string.sub(ngx.var.uri, 2)

  }
  root /var/www/luaProject/img/;
  try_files    $uri /index.html;


  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...