Назад | Перейти на главную страницу

Как можно использовать mod_rewrite для перенаправления нескольких определенных URL-адресов, содержащих несколько строк запроса?

мы недавно перевели сайт с пользовательской CMS на drupal. Чтобы сохранить некоторые ссылки, добавленные нашими пользователями в закладки (у нас около 120 перенаправлений), мы хотели бы перенаправить исходные URL-адреса на новый URL-адрес.

Я искал пару дней, но не могу найти ничего простого, что мне нужно.

У нас есть существующие URL-адреса, которые содержат одну или несколько строк запроса, например:
/article.php?issue_id=12&article_id=275

и мы хотели бы переехать в новое место:
http://foobar.edu/content/super-happy-fun-article

Я начал использовать:

RewriteEngine On  
RewriteRule ^/article\.php?issue_id=12&article_id=275$ http://foobar.edu/content/super-happy-fun-article [R=301,L]  

Однако это не работает.

Работает простой RewriteRule:

RewriteRule ^test\.php$ index.php  

Мне непонятно, как использовать {QUERY_STRING} с несколькими

По сути, это 120 простых перенаправлений, которые переходят с одного существующего URL на новый. Мне не нужны диапазоны [0–9], потому что для существующих URL нет последовательного порядка.

Возможно, я смогу сделать то, что мне нужно, с RewriteMap и простой текстовый файл, содержащий такую ​​строку:

index.php?issue_id=12&articleType_section=0&articleType_id=65 http://foobar.edu/category/fall-2008

Если у кого-то есть идеи об использовании mod_rewrite для достижения этой цели или если есть лучший или более простой мод, я тоже открыт для этого.

Спасибо!

Создавать правило перезаписи для каждой возможной устаревшей ссылки не очень эффективно. Поэтому, вероятно, лучшим вариантом будет перенаправление php на новую ссылку. Создайте функцию «generateLink», которая анализирует $ _REQUEST и создает «новую» ссылку, а затем выдаёт header("Location: $newLink", '', 301). Вызовите generateLink () в верхней части article.phpперед генерацией любого вывода (иначе header () завершится ошибкой)

RewriteRules (по умолчанию) работают только с частью URL, а не с частью запроса (часть, стоящая за?). Чтобы создать правила, которые срабатывают в зависимости от части запроса, вам необходимо установить условия для строки запроса.

RewriteCond %{QUERY_STRING} ^issue_id=12&article_id=275$
RewriteRule ^/article\.php http://foobar.edu/content/super-happy-fun-article [R=301,L]

Чтобы получить то, что вы просили.

Но при 120 редиректах лучше использовать собственный article.php.

Если вам нужно сделать это быстро, не могли бы вы просто написать новый article.php, который будет перенаправлять на правильную страницу drupal?

<?php

$locations[12][275] = 'content/super-happy-fun-article';
$issue = $_GET['issue_id'];
$article = $_GET['article_id'];
if(isset($locations[$issue][$article]){
 $go = $locations[$issue][$article];
}
else{
 $go = 'broken_link'
}

header( 'Location: http://www.yoursite.com/'. $go );