Рейтинг:1

переписать и принудительно перенаправить при перезаписи URL-адреса источника в nginx

флаг in

У меня есть этот экземпляр, где поиск html <form> заставляет его идти к /search/index.php?q=термин и хотел бы использовать что-то вроде /искать термин вместо.

Вот так сейчас выглядит конфиг:

местоположение /поиск/ {
    переписать ^/search/(.+) /search/index.php?q=$1;
}

Прямой доступ к этому местоположению работает, но в момент заполнения формы и поиска в ней будет использоваться «происхождение», а не перезапись.

Я попытался использовать перенаправление «назад», но это привело к сбою службы nginx:

местоположение /поиск/ {
    переписать ^/search/(.+) /search/index.php?q=$1;
    перенаправить ^/search/index.php?q=(.+) /search/$1;
}

Я также пытался переписать с помощью постоянный флаг, который ничего не делал

местоположение /поиск/ {
    переписать ^/search/(.+) /search/index.php?q=$1;
    переписать ^/search/index.php?q=(.+) /search/$1 навсегда;
}

Я знаю, что в PHP можно добиться того же, что-то вроде этого:

// В верхней части /search/index.php
если (str_starts_with($_SERVER['REQUEST_URI'], '/search/index.php')){
    $протокол = ($_SERVER['HTTP_X_FORWARDED_PROTO'] == "https")? «https» : «http»;
    $сервер = $_SERVER['HTTP_HOST'];
    $запросы = массив();
    parse_str($_SERVER['QUERY_STRING'], $запросы);
    $search = $queries['q'] ?? "";
    header("Расположение: $protocol://$server/search/$search");
}

Но думаю, было бы лучше, если бы nginx мог с этим справиться (если это вообще возможно).

Кто-нибудь знает, как переписать и перенаправить доступ из источника?

Richard Smith avatar
флаг jp
Не знаю, что такое команда `redirect`. Но можете ли вы показать запись в журнале доступа для неудавшегося запроса?
Typewar avatar
флаг in
@RichardSmith Хорошо, я понял, я ошибся с самого начала.Взял отсюда https://ubiq.co/tech-blog/rewrite-vs-redirect-nginx/. Журнал Nginx systemd действительно говорит, что это неизвестная директива
Richard Smith avatar
флаг jp
Что вы подразумеваете под "происхождением"? Вы говорите, что форма отправляет запрос на `/search/index.php?...`, и вы хотели бы, чтобы адресная строка браузера была изменена на `/search/...`?
Typewar avatar
флаг in
Да, или, точнее: `/search/index.php?q=[term]`, и перенаправить его на `/search/[term]`
Рейтинг:1
флаг jp

Существующая конфигурация выглядит примерно так:

местоположение /поиск/ {
    переписать ^/search/(.+) /search/index.php?q=$1;
}
расположение ~ \.php$ {
    ...
}

URI /поиск/index.php используется внутри, поэтому попытка использовать переписать ^/search/index.php?q=(.+) /search/$1 навсегда; создаст петлю перенаправления.

Чтобы идентифицировать URI как внешний запрос, надо посмотреть $request_uri переменная. И для этого вам нужно будет использовать печально известный если утверждение. Например:

если ($request_uri ~ ^/search/index\.php\?q=(.+)) {
    вернуть 301 /поиск/$1;
}
местоположение /поиск/ {
    переписать ^/search/(.+) /search/index.php?q=$1;
}
расположение ~ \.php$ {
    ...
}
Typewar avatar
флаг in
Да я вижу. Я попытался поместить оператор if в область видимости `/search/`, но это не сработало. За рамками работает. Спасибо огромное!
Richard Smith avatar
флаг jp
Действительно, URI `/search/index.php` обрабатывается блоком `location ~ \.php$`, поскольку он заканчивается на `.php`.
Typewar avatar
флаг in
Ах! это понятно, спасибо за уточнение
флаг us
Можно также использовать `if ($arg_q ~ (.+))` в качестве условия `if`. Он соответствует только тогда, когда аргумент запроса `q` не пуст. Использование `$request_uri` не требуется.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.