Перепишите URL-адреса Nginx с параметрами (после вопросительного знака)

У меня есть URL-адреса в таком формате:

/wiki/index.php?title=Widget
/wiki/index.php?title=Blue
/wiki/index.php?title=Red
/wiki/index.php?title=Etc

Я хочу иметь возможность сопоставлять любой URL-адрес с шаблоном "/wiki/index.php?title=" или даже просто "/wiki/index.php" (но чтобы он подбирал указанные выше URL-адреса с "?" ), а затем перенаправить их просто на / wiki / (все страницы, соответствующие указанному выше шаблону, переходят на один URL / wiki /)

Раньше я устанавливал Mediawiki в каталоге / wiki / с множеством страниц в указанном выше формате. Однако теперь я запускаю установку Wordpress, и она использует каталог / wiki /. Мне не нужно, чтобы каждый переписанный URL-адрес переходил к другому URL-адресу (я знаю, что это сложно, поскольку у моих исходных URL-адресов есть параметры), но сейчас все они 404, и поэтому я просто хочу по крайней мере направить на них / wiki /.


person Matt    schedule 30.11.2018    source источник
comment
Если я правильно понимаю, вы хотите перейти от /wiki/index.php?title=ABC к / wiki / ABC? Или просто перейдите из /wiki/inex.php?title=ABC в / wiki /?   -  person Ryan Z    schedule 30.11.2018
comment
Привет, @RyanZ, я был бы счастлив, если бы все, что соответствует этому формату, было отправлено в / wiki /   -  person Matt    schedule 30.11.2018
comment
Если у вас есть несколько URI для перенаправления, вам следует подумать об использовании map. См. этот ответ.   -  person Richard Smith    schedule 30.11.2018
comment
Спасибо @RichardSmith - не знаю, как я это пропустил при поиске. Работает отлично. Еще пришлось добавить map_hash_max_size 262144; map_hash_bucket_size 262144; до правил карты, иначе я получил бы не могу построить map_hash, вы должны увеличить map_hash_bucket_size: ошибка 64   -  person Matt    schedule 01.12.2018
comment
Собственно map_hash_bucket_size 128; один сделал свое дело, map_hash_max_size не требуется   -  person Matt    schedule 01.12.2018


Ответы (1)


Простое переписывание URL

Самый простой случай (перепишите все /wiki/index.php запросы с любыми аргументами) можно сделать с помощью этой конфигурации (внутри вашего server блока):

location = /wiki/index.php {
    rewrite .* /wiki/?;
}

'?' Знак в конце второго параметра rewrite - это уловка для полного удаления любых аргументов запроса. Без него запрос /wiki/index.php?title=Widget будет переписан на /wiki/?title=Widget.

Переписать только запросы, соответствующие /wiki/index.php?title=..., сложнее, я не знаю, как это сделать без конструкции if:

location = /wiki/index.php {
    if ($request_uri ~ ^/wiki/index\.php\?title=) {
        rewrite .* /wiki/?;
    }
}

Если вы хотите сгенерировать перенаправление HTTP 301 или 302 вместо простого переопределения URL, вы можете использовать флаг redirect (для временного перенаправления 301) или permanent (для постоянного перенаправления 302) в конце параметров директивы rewrite (см. документация).

Перезапись URL-адресов на отдельные страницы

Это не так сложно, как кажется. Для перенаправления /wiki/index.php?title=Widget на /wiki/Widget, /wiki/index.php?title=Blue на /wiki/Blue и т. Д. Мы можем использовать map < / a> директива:

map $request_uri $uri_suffix {
    ~^/wiki/index\.php\?title=([^&]*) $1;
}

server {
    ...
    location = /wiki/index.php {
        rewrite .* /wiki/$uri_suffix?;
    }
    ...
}

Обратите внимание, что директива map должна быть объявлена ​​вне вашего server блока конфигурации!

person Ivan Shatsky    schedule 30.11.2018
comment
Спасибо, Иван, это отлично сработало бы, если бы мой Blue_Widget в старой структуре был таким же, как blue-widget-random в новой - к сожалению, это не так. Этот ответ помог мне stackoverflow.com/questions/49191594/, но мне пришлось добавить map_hash_max_size 262144; map_hash_bucket_size 262144; прежде, чем правила карты, иначе я получил бы не могу построить map_hash, вы должны увеличить ошибку map_hash_bucket_size: 64. Спасибо. Надеюсь, ваш ответ будет полезен людям, адреса страниц которых в остальном остались прежними. - person Matt; 01.12.2018
comment
Собственно map_hash_bucket_size 128; один сделал свое дело, map_hash_max_size не требуется - person Matt; 01.12.2018
comment
Вы можете удалить if, используя расположение регулярного выражения, которое соответствует строкам, имеющим q / wiki / index.php? Title = `, как показано здесь. - person Ryan Z; 01.12.2018
comment
@RyanZ Нет, не можешь. Согласно документации (а также моему опыту) сопоставление выполняется против нормализованного URI без части запроса запроса. Пример, который вы предоставили со своей ссылкой, не использует часть запроса в блоке location, также см. этот ответ. - person Ivan Shatsky; 02.12.2018