.htaccess перенаправляет несколько разных "? p =" на c страниц - PullRequest
1 голос
/ 14 июля 2020

У меня есть перенаправления, которые я пытаюсь решить:

RedirectMatch 301 /?p=10 /my-first-page
RedirectMatch 301 /?p=20 /my-second-page
RedirectMatch 301 /?p=30 /my-second-page
RedirectMatch 301 /?p=40 /my-third-page

Поскольку перенаправление не работает таким образом, из-за ?, я нашел следующее решение для одного из них:

RewriteCond %{QUERY_STRING} p=10 [NC]
RewriteRule ^(.*)$ /my-first-page? [L,R=301]

Мой вопрос: могу ли я как-то оптимизировать это, чтобы не писать эти две строки для каждого перенаправления, которое я пытаюсь сделать? Могу ли я, по крайней мере, вставить все номера страниц (20 и 30), которые должны перенаправлять на одну и ту же целевую страницу с использованием массива?

Мне, возможно, придется сделать это примерно для 100 страниц, поэтому любая оптимизация приветствуется. Спасибо за вашу помощь.

1 Ответ

1 голос
/ 14 июля 2020

могу ли я как-то оптимизировать это, чтобы не писать эти две строки для каждого перенаправления, которое я пытаюсь сделать?

Вы не можете сделать это только в .htaccess, потому что нет Похоже, что это не какой-либо «шаблон», который сопоставляет этот числовой c идентификатор с целевым URL.

(Если у вас есть доступ к конфигурации сервера, вы можете создать RewriteMap, который содержит сопоставление идентификатора по URL-адресу. Затем его можно вызвать из .htaccess. Но я предполагаю, что у вас нет доступа к конфигурации сервера здесь?)

Могу ли я, может быть, вставить хотя бы все номера страниц (20 и 30) которые нужно перенаправить на ту же целевую страницу с использованием массива?

Вы, конечно, можете это сделать. Либо с использованием чередования (например, (20|30|40)) как @CBroe, упомянутого в комментариях, либо с использованием другого шаблона регулярного выражения. например. [1-4]0 соответствует 10, 20, 30 и 40.

Однако вместо «перенаправления», вероятно, предпочтительнее внутренне переписать запрос к ту же целевую страницу, а затем используйте серверный сценарий для поиска идентификатора и выполнения соответствующего внешнего перенаправления - если перенаправление требуется.

Например:

RewriteCond %{QUERY_STRING} ^p=(10|20|30|40)$
RewriteRule ^$ redirect-handler.script [L]

Обратите внимание, что NC не требуется, если вам действительно не нужно соответствовать как p, так и P?

Затем в /redirect-handler.script вы сохраняете массив всех идентификаторов и URL-адресов, которые должны быть перенаправлены, и выдаете внешнее перенаправление 3xx в зависимости от ситуации.

В приведенном выше примере строка запроса, например. p=10 передается в целевой сценарий по умолчанию - его не нужно явно передавать, если вы в порядке, используя то же имя параметра URL-адреса в целевом сценарии. Однако, если вы хотите явно передать значение (возможно, с другим именем параметра, например id), вы можете изменить приведенное выше правило следующим образом:

RewriteCond %{QUERY_STRING} ^p=(10|20|30|40)$
RewriteRule ^$ redirect-handler.script?id=%1 [L]

Где %1 - это обратная ссылка на захваченный подшаблон в последнем совпавшем CondPattern . ie. Все, что соответствует (10|20|30|40).

Обратите внимание, что это соответствует запросам формы example.com/?p=10, как обозначено RewriteRule шаблоном ^$ (пустой URL-путь).

...