Новые NICE URL с кодом 301. Как заставить их работать вместе?

У меня есть эта старая структура URL-адреса веб-сайта:

site.com/folder/prod.php?cat=MAIN%20CAT%20&prodid1=123&prodtitle=PROD%20TITLE&subcat=SUB%20CAT

и реальный пример будет примерно таким:

site.com/folder/prod.php?cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS

здесь вы можете видеть, что для страницы продукта есть 4 переменные: категория, идентификатор продукта, название продукта и подкатегория. Некоторые из этих переменных использовались для открытия меню. И да, URL вытягивает переменные с пробелом и в нижнем, и в верхнем регистре.

Новый URL-адрес сайта имеет новую структуру:

site.com/x/product-title-prodid2

пример rel будет выглядеть так:

site.com/x/mtx-amps-8888

Это достигается с помощью двух переменных (дружественный slug + второй идентификатор продукта: prodid2) со следующим кодом в .htaccess.

<IfModule mod_rewrite.c>
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /

RewriteRule ^p/(.*)/$ product.php?prodid2=$1
RewriteRule ^p/(.*)$ product.php?prodid2=$1

</IfModule>

Внутренне мы можем получить prodid2, если у нас есть prodid1 из той же таблицы, но не наоборот.

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

Мы попытались добавить в htaccess следующее:

RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]

и работает только для 1 товара, но при добавлении 2х и более сайт падает. Я представляю, что это будет бесконечный цикл?

Альтернативой может быть добавление:

ErrorDocument 404 /404.php

чтобы получить URL-адрес и перенаправить на страницу, но это было бы некрасиво для SE.


ОБНОВИТЬ:

Извините за непонимание в этой теме, я очень новичок в этом.

Продукт имеет 2 важных идентификатора. Например:

MTX AMP (фактическое название продукта), если он указан в 3 категориях, будет иметь 1 повторяющийся одиночный prodid2 и 3 разных prodid1 (по 1 для каждой категории). Все они находятся в одной таблице. Итак, если у нас есть prodid1, мы можем получить prodid2, который находится рядом с ним в таблице db.

Правило для получения красивого URL-адреса на новом сайте вытягивается с помощью prodid2.

RewriteRule ^p/(.*)$ product.php?prodid2=$1

который приносит полное значение, хранящееся в базе данных. например mtx-amps-8888 ‹‹ это смесь слага + prodid2

полный URL:

site.com/p/mtx-amps-888

(p — это просто виртуальный фордер, и мы используем эту переменную, чтобы показать правильный шаблон страницы)

Так что mtx-amps-888 это не 3 ключа, они генерируются при создании товара и сохраняются все вместе в одном поле в БД. Они уже включают разделение - так в хтакцессе этого нет.

Значение cat (ключ) действительно используется для расширения меню, используемого на старом сайте, но для создания перенаправления 301 мы, вероятно, будем использовать prodid1, поскольку мы можем сопоставить это значение, чтобы получить prodid2. prodid2 используется в качестве основного запроса для получения хорошего URL-адреса на новом сайте, и его значение приведет к хорошему URL-адресу, хранящемуся в базе данных.

Что имеет смысл из всех моих исследований, так это следующее:

<IfModule mod_rewrite.c>
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /

RewriteRule ^p/(.*)$ product.php?prodid2=$1

RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]

RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=5555&prodtitle=BOSS%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]

RewriteCond %{QUERY_STRING} ^cat=CAR%20VIDEO&prodid1=6666&prodtitle=ALPINE%20DVDS&subcat=DVD%20PLAYERS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]

</IfModule>

Пожалуйста, обратите внимание, что я удалил строку из основного правила перезаписи:

RewriteRule ^p/(.*)/$ product.php?prodid2=$1

Это только гарантирует, что пользователь также может использовать / в конце URL-адреса: site.com/p/mtx-amps-888/

Я также повторил условие перезаписи для 301 редиректа 3 продуктов, но у меня действительно есть около 3000 продуктов, чтобы перечислить здесь. Если я оставлю 1, это будет работать, но если я добавлю 2, я полагаю, что будет создан цикл.

Надеюсь, это имеет смысл. Вы не представляете, как важно для меня запустить это, так что мои наилучшие пожелания тем, кто может помочь :)


person user1924270    schedule 22.12.2012    source источник
comment
Действительно запутанно. ¿Что такое и как получить prodid1, упомянутый в ...Внутренне мы можем получить prodid2, если у нас есть prodid1...? Всегда ли 3 ключа (товар-название-prodid2)? ¿Они всегда разделены -? Например, в запросе cat – это ключ, а CAR%20AUDIO – это значение. Будет более понятно использовать эти атрибуты в ваших примерах, например key1=value1 и т.д.   -  person Felipe Alameda A    schedule 23.12.2012
comment
Спасибо за быстрый ответ, я поражен тем, как быстро люди готовы помочь. Надеюсь, что скоро смогу поделиться своим опытом.   -  person user1924270    schedule 23.12.2012


Ответы (1)


Просто заново создайте файл /folder/prod.php и пусть php сделает перенаправление. Это самое простое и чистое решение.

<?php
  $prodid1 = $_GET['prodid1'];
  //calculate prodid2 based on prodid1, or use mysql to retreive the prodid2 belonging to prodid1
  $prodid2 = $prodid1;//just for testing
  $newpath = "/p/$prodid2/";

  // redirect using 301
  header("Location: http://{$_SERVER['HTTP_HOST']}{$newpath}");
  header('HTTP/1.1 301 Moved Permanently');
?>
person Gerben    schedule 23.12.2012