Autor Zpráva
davchy
Profil
Na stránkách mám generované odkazy typu: ………/products/kosmetika-vivien-parfum-Arrogance-seznam-1.html (význam nese jednička, která je ID produktu, před „-1“ může být v odkazu cokoliv)

Přepsaný odkaz by měl být: ……../index.php?main_page=product_info&products_id=1

Prošel jsem na netu kdeco, ale zprovoznit funkční pravidlo se mi nepovedlo. Jak by pravidlo mělo být? Budu vám zauzlován. Díky moc. Jen upřesňuji, že jiná pravidla mi fungují. Poslední pokus byl tento:

RewriteRule ^products/(.*)-seznam-(.*)\.html /index.php?main_page=product_info&products_id=$1 [L]

Přepsalo mi to takto:

……../index.php?main_page=products_general_info&products_id=eaeaface

Ani nevím, kde se tam vzalo to „general“ a o ID snad ani nemluvě.

Ještě jednou děkuji za jakoukoliv případnou radu.
Kajman
Profil *
Zkus tohle.

RewriteRule ^products/(.*)-seznam-([0-9]+)\.html$ /index.php?main_page=product_info&products_id=$2 [L]

To dolar číslo je pořadí otevírací závorky, kterou chceš vycucnout. General je divnost, nemělo by to tam být.
davchy
Profil
Funguje to, díky moc. Hlavně i za vysvětlení.
davchy
Profil
Ještě k tomuto jeden dotaz:
Nevím proč, ale při každém novém otevření okna prohlížeče a prvním kliknutí na upravovaný odkaz, se za .html přidá něco na způsob &zenid=22587e2563a58785d…. atd. Za použití uvedeného pravidla to pak nefunguje. Když ale na odkaz kliknu podruhé a po xté, tak už se za .html nic nedoplní a vše funguje dobře. Napadlo mě (jen logickou cestou, nijak tomu nerozumím) z pravidla odstranit $ za .html a pak už to fungovalo i na to první kliknutí, i když se tam připojilo to zenid. Podle mě by se tam ale nic připojovat nemělo. Neporadíte, proč se to tak chová? Připojuji i funkci, která se stará o generování odkazů. Je tam voláno url_data.php, kde není nic jiného, něž definování zobrazovaných odkazů. Příklad:

"cid1_8" => "Keyboards",
"cid1_9" => "Mice",
"pid1" => "Matrox_G200_MMS",



Tady je ta funkce:

////
// The HTML href link wrapper function
function zen_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true, $static = false, $use_dir_ws_catalog = true) {
global $request_type, $session_started, $http_domain, $https_domain;

if (!zen_not_null($page)) {
die('</td></tr></table></td></tr></table><br /><br /><strong class="note">Error!<br /><br />Unable to determine the page link!</strong><br /><br />');
}

if ($connection == 'NONSSL') {
$link = HTTP_SERVER;
} elseif ($connection == 'SSL') {
if (ENABLE_SSL == 'true') {
$link = HTTPS_SERVER ;
} else {
$link = HTTP_SERVER;
}
} else {
die('</td></tr></table></td></tr></table><br /><br /><strong class="note">Error!<br /><br />Unable to determine connection method on a link!<br /><br />Known methods: NONSSL SSL</strong><br /><br />');
}

if ($use_dir_ws_catalog) $link .= DIR_WS_CATALOG;

if (!$static) {
if (zen_not_null($parameters)) {
if ((USER_FRIENDLY_URLS_REWRITE == 'true') &&
(!ereg('language', $parameters)) &&
(!ereg('manufacturers_id', $parameters)) &&
(!ereg('contact_us', $page)) &&
(!ereg('review', $page)) &&
(!ereg('review', $parameters))
) {

$parameters = str_replace('&sort=', '/sort', $parameters);
$parameters = str_replace('&page=', '/page', $parameters);
$parameters = str_replace('&filter_id=', '/filter', $parameters);
$parameters = str_replace('disp_order=', 'display', $parameters);

if (($page == "index") && (ereg('cPath', $parameters))){
$cnum = str_replace('cPath=', 'cid', $parameters);
$parameters = str_replace("cPath=", "categories/", $parameters);
$link .= $parameters . '.html';
require("url_data.php");
if ($urlrpl[$cnum] != NULL) {
$link = ereg_replace("categories/[0-9_]{1,}", "categories/$urlrpl[$cnum]", $link);
}
}

elseif (($page == "product_info") && (ereg('products_id', $parameters))){
$pnum = str_replace('products_id=', 'pid', $parameters);
$pnum = ereg_replace('cPath=[0-9_]{1,}&', '', $pnum);
$parameters = str_replace("products_id=", "products/", $parameters);
$parameters = ereg_replace('cPath=([0-9_]{1,})&', '', $parameters);
$parameters = str_replace('action=notify&','notify', $parameters);
$parameters = str_replace('action=add_product&','add', $parameters);
$parameters = str_replace('&reviews_id=','review/', $parameters);
$parameters = str_replace('&action=notify_remove','notify_remove', $parameters);
$parameters = str_replace('&action=notify','notify', $parameters);
$link .= $parameters . '.html';
require("url_data.php");
if ($urlrpl[$pnum] != NULL) {
$link = ereg_replace("products/[0-9]{1,}", "products/$urlrpl[$pnum]", $link);
}
}

elseif ($page == 'redirect') {
if (ereg('banner', $parameters)){
$parameters = str_replace('action=banner&goto=', 'redirect_banner', $parameters);
$link .= $parameters . '.html';
}
if (ereg('url', $parameters)){
$parameters = str_replace('action=url&goto=', 'redirect_url-', $parameters);
$link = $parameters;
}
}

elseif ($page == 'tell_a_friend') {
$parameters = str_replace('to_email_address=','/to_', $parameters);
$parameters = str_replace('products_id=','/products', $parameters);
$parameters = str_replace('action=process&','/send', $parameters);
$link .= $page . $parameters . '.html';
}

elseif (
($page == "products_all") or
($page == "products_new") or
($page == "featured_products") or
($page == "specials)")
){

$link .= $page ."/" . $parameters . '.html';
} else {

$link .= 'index.php?main_page='. $page . "&" . zen_output_string($parameters);


}

} else {
$link .= 'index.php?main_page='. $page . "&" . zen_output_string($parameters);
}
} else {
if (USER_FRIENDLY_URLS_REWRITE == 'true') {
if (
($page == 'login') or
($page == 'advanced_search') or
($page == 'specials') or
($page == 'featured_products') or
($page == 'products_new') or
($page == 'products_all') or
($page == 'shippinginfo') or
($page == 'privacy') or
($page == 'conditions') or
($page == 'contact_us') or
($page == 'gv_faq') or
($page == 'site_map') or
($page == 'logoff') or
($page == 'account') or
($page == 'shopping_cart') or
($page == 'popup_shipping_estimator') or
($page == 'news_manager_all_news') or
($page == 'unsubscribe') or
($page == 'reviews') or
($page == 'checkout_shipping')
){
$link .= $page . ".html";
} else {
$link .= 'index.php?main_page=' . $page;
}
} else {
$link .= 'index.php?main_page=' . $page;
}
}
} else {
if (zen_not_null($parameters)) {
$link .= $page . "?" . zen_output_string($parameters);
} else {
$link .= $page;
}
}

$separator = '&';

while ( (substr($link, -1) == '&') || (substr($link, -1) == '?') ) $link = substr($link, 0, -1);
// Add the session ID when moving from different HTTP and HTTPS servers, or when SID is defined
if ( ($add_session_id == true) && ($session_started == true) && (SESSION_FORCE_COOKIE_USE == 'False') ) {
if (defined('SID') && zen_not_null(SID)) {
$sid = SID;
// } elseif ( ( ($request_type == 'NONSSL') && ($connection == 'SSL') && (ENABLE_SSL_ADMIN == 'true') ) || ( ($request_type == 'SSL') && ($connection == 'NONSSL') ) ) {
} elseif ( ( ($request_type == 'NONSSL') && ($connection == 'SSL') && (ENABLE_SSL == 'true') ) || ( ($request_type == 'SSL') && ($connection == 'NONSSL') ) ) {


if ($http_domain != $https_domain) {
$sid = zen_session_name() . '=' . zen_session_id();
}
}
}

// clean up the link before processing
while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);
while (strstr($link, '&amp;&amp;')) $link = str_replace('&amp;&amp;', '&amp;', $link);

if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);

$link = str_replace('
davchy
Profil
Trochu jsem to přetáhl, tak ještě zbytek kódu: (pár řádků se překrývá)



// clean up the link before processing
while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);
while (strstr($link, '&amp;&amp;')) $link = str_replace('&amp;&amp;', '&amp;', $link);

if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);

$link = str_replace('&amp;', '/', $link);
$link = str_replace('?', '/', $link);
$link = str_replace('&', '/', $link);
$link = str_replace('=', '/', $link);

$separator = '?';
}

if (isset($sid)) {
$link .= $separator . $sid;
}

// clean up the link after processing
while (strstr($link, '&amp;&amp;')) $link = str_replace('&amp;&amp;', '&amp;', $link);

$link = ereg_replace('&', '&amp;', $link);
return $link;
}



Děkuji za pomoc
Kajman
Profil *
Měla by pomoci malá úprava.

RewriteRule ^products/(.*)-seznam-([0-9]+)\.html$ /index.php?main_page=product_info&products_id=$2 [L,QSA]

QSA - přidá hodnoty z query stringu z původní adresy k tomu novému
Kajman
Profil *
Aha, ... ale to by se to zenid mělo přidávat za ?. Takže to asi fakt dělá nepřesné adresy někde v té funkci.
Kajman
Profil *
Asi bude tedy třeba před

return $link;

napsat ještě

if(strpos($link,'?')===false) $link=str_replace('&amp;','?',$link,1);
davchy
Profil
No jo, jenže to pak hodilo:
Warning: Wrong parameter count for str_replace()

:(
Kajman
Profil *
Tak to asi jde jen v php5 :-)

Ještě by to mohlo jít takto nějak...

if(strpos($link,'?')===false && strpos($link,''&amp;')!==false) $link= substr_replace($link,'?',strpos($link,''&amp;'),5);

Nebo tak nějak. Prostě je potřeba nahradit první výsky &amp; otazníkem, pokud tam už otazník není.
davchy
Profil
Chybu už to nehlásí, teda hlásilo, ale ''&amp;' jsem upravil na '&amp;' Problém ale trvá, jen se "&" nahradilo "?", tedy odkaz je takto:

kosmetika-vivien-parfum-Destiny-seznam-590.html?zenid=0c9be7e6850605b1 ee9fb432b6d5d26a

Za ".html" ale už prostě nic být nesmí. Je ale zvláštní, že se to tam u odkazů zobrazuje jen při novém otevření okna a prvním kliku. Pak už všechno správně končí ".html"
Kajman
Profil *
Pokud tam už je ten ? tak by to mělo být s tím QSA bez problémů. Tu proměnnou to tam asi dává, že si ještě není systém jistý, že klient akceptuje cookies.
davchy
Profil
Tak to už v tom případě je vyřešený problém. Děkuji za čas.
Lukáš M
Profil
zdravím a rovněž mnohokrát děkuji! na této diskusi jsem se "přiživil" a odvodil si následující pravidlo:

RewriteRule ^(.*)-([0-9]+)/(.*)-([0-9]+)\.html$ index.php?rid=$2&id=$4 [L]

podle mě je to jedno z potencionálně nejzajímavějších přesto jsem jej jako vzorové ani nějaký příklad, který by na něj vedl, hledal marně. ale asi to bude také dost tím, že jsem na "linuxoidní" (což regexp určitě jsou) věci lamka a při slovním spojení "regulární výrazy" dostávám už od maturitního ročníku vyrážku :)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0