Мне нужно перенаправить некоторые URL-адреса из старой версии веб-сайта на новые URL-адреса. Я не нашел проблемы с простыми URL-адресами, но я не могу заставить URL-адреса с querystrings работать:
Redirect 301 /product_detail.php?id=1 http://www.mysite.com/product/permalink
Он просто возвращает 404, а не найден.
Я также пробовал с маршрутом на Silex (микроструктура PHP, которую я использую), но это тоже не сработало:
$app->get('/product_detail.php?id={id}', function($id) use ($app) { $prodotto = Product::getPermalink($id); return $app->redirect($app['url_generator']->generate('product',array('permalink'=>$prodotto))); });
Есть ли способ с некоторым правилом htaccess, чтобы строка запроса считалась частью URL-адреса и позволяла ей перенаправляться должным образом?
Спасибо.
Перенаправление 301 /product_detail.php?id=1
http://www.mysite.com/product/permalink
Redirect
– это директива mod_alias, не соответствующая манипулированию строками запроса:
mod_alias предназначен для обработки простых задач манипулирования URL-адресами. Для более сложных задач, таких как манипулирование строкой запроса, используйте инструменты, предоставляемые mod_rewrite.
Извлечен из документов Apache mod_alias
Итак, mod_rewrite
следует использовать. Тот же пример в одном файле .htaccess в корневом каталоге будет примерно таким:
Options +FollowSymlinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^/product_detail\.php [NC] RewriteCond %{REQUEST_URI} !/product/permalink [NC] RewriteRule .* /product/permalink [R=301,NC,L]
Он перенаправляет
http://www.mysite.com/product_detail.php?id=1
Для того, чтобы:
http://www.mysite.com/product/permalink?id=1
Запрос был автоматически добавлен к URL-адресу подстановки.
Для внутреннего отображения замените [R = 301, NC, L] на [NC, L]