Как перенаправить URL-адреса на основе строки запроса? - программирование

Как перенаправить URL-адреса на основе строки запроса?

Я успешно переносил сайт Wordpress на Drupal. К сожалению, в Wordpress URL-адрес контента был похож на www.example.org/?p=123. Мой домен по-прежнему остается прежним, но я хочу сделать перенаправление через htaccess, поскольку Drupal не позволит URL-адресу быть www.example.org/?p=123. Другими словами, контент не имеет того же URL-адреса, что и в Wordpress. Например, новый URL-адрес Drupal будет похож на www.example.org/content/MyNewPage

Я пробовал это в моем файле .htaccess и не работает

Redirect 301 /\?p=375 http://www.example.org/content/MyNewPage

Итак, я попробовал следующее, но он тоже не работает.

Redirect 301 /\?p\=375 http://www.example.org/content/MyNewPage

Как тест, я попробовал ниже, и это сработало.

Redirect 301 http://www.example.org http://www.google.com

Я убедился, что мое правило Redirect находится в верхней части списка в моем .htaccess, поэтому сначала будет оценено. Как это исправить?

4b9b3361

Ответ 1

ни Redirect, ни RedirectMatch не позволяют указать строку запроса для источника перенаправления. [Источник]

Вы должны использовать mod-rewrite для перенаправления на основе строки запроса:

RewriteCond %{QUERY_STRING}  ^p=375$
RewriteRule (.*)  http://www.example.org/content/MyNewPage?  [R=301,L]

Ответ 2

Вы можете рассмотреть возможность использования ModRewrite в htaccess

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{QUERY_STRING}     ^p=345$    [NC]
RewriteRule index.php content/MyNewPage [NC,L,R=301]

</IfModule>

И вы также можете передать старый идентификатор страницы в новый конкатенированный URL (или, может быть, QS?):

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{QUERY_STRING}     ^p=(.*)$    [NC]
RewriteRule index.php content/MyNewPage-%1 [NC,L,R=301]

</IfModule>