Autor Zpráva
casy
Profil
Ahoj,

mám problém s přesměrováním starých URL adres na nové. Vyzkoušel jsem desítky postupů z fór, ale bez úspěchu. Mám seznam všech starých i nových url a potřebuji najít správný příkaz pro htaccess aby se přesměrování provedlo.

Nepotřebuji přepisovat URL pouze přesměrovat staré url (index.php?p=item_detail&id=1, které hází 404 na nové funkční adresy typu /detail/id/nazev/, které již fungují.)

# OLD LINK
# http://www.stranka.cz/index.php?p=detail-polozky&id=644
# NEW LINK
# http://www.stranka.cz/detail/644/url_name

Vyzkoušel jsem následující

RewriteEngine On
Redirect 301 /index.php?p=detail-polozky&id=644 http://www.stranka.cz/detail/394/url_name

další pokus

RewriteEngine On
RewriteRule /index.php?p=detail-polozky&id=644 http://www.stranka.cz/detail/394/url_name [R=301,L]

Raději uvádím celý htaccess..

RewriteEngine On

# cele domeny (aliasy)
RewriteCond %{REQUEST_URI} !^domains/
RewriteCond %{REQUEST_URI} !^/domains/
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
RewriteCond %{DOCUMENT_ROOT}/domains/%2 -d
RewriteRule (.*) domains/%2/$1 [DPI]

# subdomeny (s nebo bez www na zacatku)
RewriteCond %{REQUEST_URI} !^subdom/
RewriteCond %{REQUEST_URI} !^/subdom/
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)\.([^\.]*)\.([^\.]*)$
RewriteCond %{DOCUMENT_ROOT}/subdom/%2 -d
RewriteRule (.*) subdom/%2/$1 [DPI]

# aliasy - spravne presmerovani pri chybejicim /
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^domains/[^/]+/(.+[^/])$ /$1/ [R]

# subdomeny - spravne presmerovani pri chybejicim /
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^subdom/[^/]+/(.+[^/])$ /$1/ [R]


RewriteEngine On

RewriteRule ^export_googlebase.xml$ /export_googlebase.php [L]
RewriteRule ^export_heureka.xml$ /export_heureka.php [L]

# Hezke URL 

RewriteEngine On
RewriteRule ^index.php$ http://www.stranka.cz/$1 [R=301]

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?p=$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?p=$1&id=$2

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)?/?/?$ ?p=$1&id=$2&name2=$3


Moc děkuji za pomoc,

Dan
Kajman
Profil
Problém je zjistit url_name, které v původní adrese není a nejspíše se bude šahat do databáze podle id.

Osobně bych staré adresy hodil novému php skriptu, který vysosne url_name a přesměruje přes funkci header.

Na začátku by tedy mohlo přibýt nové pravidlo...

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{QUERY_STRING} ^p=detail-polozky&id=[0-9]+$
RewriteRule ^index\.php$ redirect-old-url.php [L]
casy
Profil
Kajman:
Děkuji moc za pomoc. Už jsem to podle toho upravil. Měl jsem bohužel víc url adres pro volání položky, ale to jsem vyřešil rozkopírováním. Naštestí jich je jen 10.

V redirect-old-url.php jsem vytvořil přesměrování pomocí funkce header

<?php
  $id = intval($_GET["id"]);
  require 'db.php';
  $con_NEW_items = mysql_query("SELECT * FROM items WHERE id = '$id' ") or die (mysql_error());
  while ($echo_NEW_item = mysql_fetch_array($con_NEW_items) ):
    $url_name = $echo_NEW_item["url_name"];
  endwhile;
  header("Location: http://www.stranka.cz/detail/$id/$url_name",TRUE,301);
?>

a htaccess tedy takto

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{QUERY_STRING} ^p=detail-item-prvni&id=[0-9]+$
RewriteRule ^index\.php$ redirect-old-url.php [L]

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{QUERY_STRING} ^p=detail-item-druhy&id=[0-9]+$
RewriteRule ^index\.php$ redirect-old-url.php [L]

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{QUERY_STRING} ^p=detail-item-treti&id=[0-9]+$
RewriteRule ^index\.php$ redirect-old-url.php [L]

Vážně děkuji,

Dan
Kajman
Profil
Více hodnot parametru p můžete zpracovat jedním pravidlem, např. s takovoto podmínkou
RewriteCond %{QUERY_STRING} ^p=detail-item-(prvni|druhy|treti)&id=[0-9]+$
casy
Profil
Kajman:
URL pro výpis položek jsem skládal z kategori např. hračky = hracky-item&id=1

Můžu tedy použít tento zápis?

RewriteCond %{QUERY_STRING} ^p=(hracky|dekorace|vyprodej)-item&id=[0-9]+$

EDIT:
Použil jsem tento zápis a funguje to skvěle! :)

Díky
casy
Profil
Když bych chtěl podobným způsobem přesměrovat URL adresy bez identifikátoru např. /?p=vyprodej na redirect-old-url2.php jak by měl zápis htaccess vypadat?

zkusil jsem tento zápis, ale nefunguje
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{QUERY_STRING} ^p=(vyprodej|dekorace|hracky)$
RewriteRule ^index\.php$ redirect-old-url2.php [L]

Díky
MSTRmt
Profil
Aby fungovalo RewriteRule se někdy musí dát před to Options +FollowSymLinks.
casy
Profil
Kajman:
Ještě jsem našel jeden problém při přesměrování. Na jiném webu jsem použil odlišnou URL adresu. Problém nastává když je za ID další parametr (název položky) a pokud v URL adrese je tak se přesměrování neprovede.

# OLD LINK
# http://www.stranka.cz/index.php?p=detail&id=644 // redirect se provede
# OLD LINK S CHYBOU
# http://www.stranka.cz/index.php?p=detail&id=644&item_name // tady je chyba a nepřesměruje se 

Používám Vaše řešení

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{QUERY_STRING} ^p=detail&id=[0-9]+$
RewriteRule ^index\.php$ redirect-old-url.php [L]

Díky za pomoc!

Dan
juriad
Profil
casy:
Druhý RewriteCond říká, že id musí být poslední parametr (výraz končí dolarem, který má význam konce). Když jej odstraníš (ten dolar), mělo by to brát každou adresu, která začíná parametry p=detail&id=[0-9]+ a za nimi může následovat cokoli.
casy
Profil
juriad:
Perfektní! Díky moc!

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0