Нови ХУБАВИ 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 променливи: категория, ID на продукта, заглавие на продукта и подкатегория. Някои от тези променливи бяха използвани за отваряне на меню. И да, 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 ‹‹ това е смесица от slug + the prodid2

пълният url е:

site.com/p/mtx-amps-888

(p е просто виртуален преход и ние се възползваме от тази променлива, за да покажем правилния шаблон на страница)

Така че mtx-amps-888 не са 3 ключа, те се генерират при създаване на продукт и се записват заедно в едно поле в db. Те вече включват разделянето - така че това не се прави в htaccess.

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

Това, което има смисъл от цялото ми изследване, би било следното:

<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 продукта, но наистина имам около 3K продукта, които да изброя тук. Ако запазя 1, ще работи, но ако добавя 2, смятам, че се създава цикъл.

Надяваме се, че това има смисъл. Нямате представа колко е важно за мен да стартирам това, така че моите най-добри пожелания към тези, които могат да помогнат :)


person user1924270    schedule 22.12.2012    source източник
comment
Наистина объркващо. ¿Какво е и как се споменава prodid1 в ...Вътрешно можем да получим prodid2, ако имаме prodid1...? Винаги ли има 3 ключа (product-title-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