Autor Zpráva
jiricz
Profil
Dobrý den,
obracím se zde na toto fórum, jelikož mi již několikrát dopomohlo k úspěšnému vyřešení problému. Nyní mám trochu pro mě "zapeklitější" problém se kterým bych potřeboval od zkušenějších poradit.

Mám jeden shop u kterého bych potřeboval vykouzlit hezké url. aktuálně mám například url s kategoriemi produktu takto:
web.cz/?p=eshop&ak=264
v url je vlastně id kategorie která se vypisuje v eshop.php. (ak) Osobně by se mi nejvíce líbilo aby url vypadala takto web.cz/eshop/kategorie nebo web.cz/kategorie.

Dále mám například pro zobrazení detailu produktu url takovouto:
web.cz/?p=detail&id=1129&ak=237
Zde by zase bylo ideální aby url vypadala nějak takto: web.cz/název produktu nebo web.cz/poslední kategorie/název produktu.

s .htaccessem zatím moc neumím, dokázal jsem nastavit takové ty základy načtení s www i bez www, přesměrování z http na https, ale toto je pro mě zatím složitější problém. Projížděl jsem zdejší fórum i se ptal googla, ale žádné z řešení zatím úplně nefungovalo.

Za každou dobrou radu předem děkuji
Davex
Profil
Na toto je nejvhodnější použít Řešení některých častějších problémů (FAQ) » Univerzální obecné pravidlo, tedy celou adresu předat skriptu, který si jí rozebere a zařídí zobrazení správné stránky.
jiricz
Profil
Toto jsem si prostudovával, ale nějako mě to nefungovalo. Nemůže být problém, že mám celý projekt na subdomeně neco.web.cz?
Url jsem už trochu upravil. Již nenačítám pomocí id ale dle názvu kategorie nebo produktu v url formátu.
Takto u kategorií:
neco.web.cz/?p=eshop&ak=nazev_kategorie
A u detailu produktu pak takto:
neco.web.cz/?p=detail&ak=nazev_kategorie&id=nazev_produktu
U toho prvního bych potřeboval přeformátovat na neco.web.cz/nazev_kategorie a u toho druhého na neco.web.cz/nazev_kategorie/nazev_produktu

Je možné udělat i výjimku, že by někde bylo odebráno jen ?p= a někde ?p=detail?

Ještě bych se chtěl zeptat co je pro vyhledávače lepší. Používat mezi slovy "-" nebo "_"?
Kajman
Profil
A rewrite máte povolené?
Řešení některých častějších problémů (FAQ) » Kterak ověřit, zda je rewrite povoleno a zapnuto

Pokud ano, jak se nefungování obecného pravidla projevovalo? Je doufám jasné, že ty odkazy typu neco.web.cz/nazev_kategorie/nazev_produktu už musí být vygenerované v html stránce a .htaccess je nezmění? Ten dělá až obrácenou práci, kdy i neexistující cestu typu /nazev_kategorie/nazev_produktu umí předat např. souboru index.php, který se pak rozhodne, co zobrazí.
jiricz
Profil
Ano rewrite je zapnuté a funkční. A ano mám odkazy v php udělané tak aby byly typu /kategorie/produkt konkretně to vypadá takto:
<a href="/'.$url_kategorie.'/'.$url_produkt.'">....</a>
Zkouše jsem různé návody například na odstranění toho ?p= ale v url se to neprojevilo, bylo to tam stále
Davex
Profil
jiricz:
Jak se parametr ?p= do adresy dostal, když v odkazech není?
Beavis
Profil
jiricz:
Nemáte zacachované šablony?
jiricz
Profil
Zacachované to není, používám anonymní okno a navíc mám v chrome cache vypnuté.
Pokusím se být konkrétnější, v předchozím příspěvku jsem to možná špatně podal.

Mám několik typů linků
1. který se vypisuje přímo na stránce index.php. Ty jsou na klasické stránky kde je jen text neco.domena.cz/?p=nazev_stranky upravil jsem ho v php na <a href="/nazev_stranky">neco</a>
2. další odkazy se vypisují už ne na index.php ale na eshop.php který je includovaný na indexu.php kde je výpis produktů neco.domena.cz/?p=eshop&ak=nazev_kategorie opět upravená na <a href="/nazev_kategorie">neco</a>
3. na detail produktu je zase třeba neco.domena.cz/?p=detail&ak=nazev_kategorie&id=nazev_produktu ten je upravený v php na <a href="/nazev_kategorie/nazev_produktu">neco</a>
a podobně

U té první varinaty jsem zkoušel toto v htaccess:
RewriteEngine on
#RewriteCond %{HTTP_HOST} ^domena.cz
#RewriteRule (.*) http://www.domena.cz/$1 [R=301,QSA,L]
 
#RewriteCond %{QUERY_STRING} ^p=([^&]+)&p=([^&]+)
#RewriteRule ^index\.php$ %1? [R=301,L,NE]
#RewriteRule ^([^/]+)/([^/]+)$ index.php?p=$ [L,QSA]

to mi akorát provedlo toto:
neco.domena.cz/nazev_stranky?p=nazev_stranky ten správný "link" to hodilo mezi / a ?p=nazev_stranky
Davex
Profil
jiricz:
Ta pravidla jsou zakomentovaná, takže se nepoužívají, a i kdybys je odkomentoval, tak nebudou dělat to, co píšeš. Proč jsi nepoužil univerzální pravidlo?
jiricz
Profil
Davex:
U těch pravidel jsem přímo na serveru # neměl takže nebyli zakomentované.
Použil jsem tedy to obecné pravidlo
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?p=$1 [QSA,L]

ale to řeší jen to co se vypisuje na strance index.php neco.domena.cz/?p=nejaka_stranka to se už zobrazuje správně.
Já ale ještě potřebuji vyřešit aby když se něco vypisuje v jiném skriptu třeba ?p=eshop neco.domena.cz/?p=eshop&ak=nejaka_kategorie to vypadalo takto neco.web.cz/nejaka_kategorie

Použil jsem k tomu ještě toto, ale to zruinovalo csska a pod.
RewriteRule ^index\.php$ %1/%2? [R=301,L,NE]
RewriteRule ^([^/]+)/([^/]+)$ index.php?p=eshop$2&ak=$1 [L,QSA]
Davex
Profil
Netuším, jak skripty přesně vypadají, ale nestačilo by z indexu podmíněně includovat jiný skript, případně z něj zavolat příslušné funkce? Každopádně to už se musí zařídit v index.php a univerzální pravidlo v .htaccess teď stačí.
jiricz
Profil
Davex:
Includovani dalších php stránek v index.php pomoci podmínek mám. Pokud se určitá podmínka splní includuje se jiná php stránka a poté je právě url ve tvaru něco.web.cz/?p=eshop&ak=nazev_kategorie a u toho mi právě to pravidlo nefunguje.

Pohlo by například přidání podmínky nebo jak se tomu v htaccess říká viz níže?
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)$ index.php?p=eshop$1&ak=$2[NC,L]
Davex
Profil
Univerzálním pravidlem se všechny adresy předají skriptu index.php, takže další pravidlo je zbytečné. Skript v index.php musí jen nějak rozhodnout jaký další skript includovat a všechny odkazy ve skriptech se musí již vytvářet v nové podobě.
jiricz
Profil
Toto chápu. Ale to univerzální pravidlo funguje akorát pokud je to neco.web.cz/?p=odkaz a ten odkaz respektive to na co odkazuje se zobrazuje přímo na index.php a ne v další includované stránce. Pokud směřuji na stránku například eshop.php s dalšími podmínkami která je includovana na index.php neco.web.cz/?p=eshop&ak=neco kde to za ak je teprve to co se má zobrazovat. Potřebuji aby vysledna url ve tvaru neco.web.cz/nekde fungovala na toto neco.web.cz/?p=eshop&ak=nekde a třeba neco.web.cz/nekde/neco pro toto neco.web.cz/?p=detail&ak=nekde&id=neco zde je více proměnných a je zapotřebí aby zmizelo v url v těchto případech i název Includovaneho eshop.php s 1 proměnnou a detail.php se 2 proměnnymi.
Davex
Profil
jiricz:
Ale to univerzální pravidlo funguje akorát pokud je to...
Ale kdepak. Univerzální pravidlo je univerzální, protože předá celou cestu skriptu do proměnné.

Tedy cestu /foo/bar předá skriptu do $_GET["p"] = "foo/bar" nebo cestu /foo do $_GET["p"] = "foo". Tuto hodnotu už stačí vhodně zpracovat a předat třeba v proměnných nebo parametrech funkcí dalším skriptům. V adresách stránek se pak už proměnné nepoužívají.
jiricz
Profil
Chápu, akorát já mám veškeré scripty v jednom adresáři. V index.php to mám includované nějak takto:
if($_GET["p"]) {
    $text = @mysql_result(mysql_query("SELECT text FROM ".$LOADER["table"]."menu WHERE odkaz = '".$_GET["p"]."'"),0);
    if($text != NULL) {
        echo'<div class="bila">'.$text.'</div>';
    } else {
        if($_GET["p"] == "detail") {
            include("./detail.php");
        } elseif ($_GET["p] == "eshop") {
            include("./eshop.php");
        }
    }
}
Což by mělo být jestli to dobře chápu ok

na eshop.php kde je výpis produktů podle zvolené kategorie byl odkaz takto: ?p=eshop&ak=urcita_kategoie upraveno na /urcita_kategorie

a v eshop.php se pak ty produkty načítají klasicky z databáze takto:
$result = mysql_query("SELECT * FROM ".$LOADER["table"]."vyrobek WHERE kategorie IN (".$_GET["ak"].") ");
while ($row = mysql_fetch_assoc($result)) {
.....
}

A jakmile právě upravím to ?p=eshop&ak=urcita_kategorie na /urcita_kategorie tak to sice url zobrazí již dobrou, ale žádný produkt se nenačte. Podle mě to je tím že to pak směřuje na ?p=urita_kategorie a ne na ?p=eshop&ak=urcita_kategorie
Keeehi
Profil
if($_GET["p"]) {
    $text = @mysql_result(mysql_query("SELECT text FROM ".$LOADER["table"]."menu WHERE odkaz = '".$_GET["p"]."'"),0);
    if($text != NULL) {
        echo'<div class="bila">'.$text.'</div>';
    } else {
        if($_GET["p"] == "detail") {
            include("./detail.php");
        } elseif ($_GET["p"] == "eshop") {
            include("./eshop.php");
        } elseif (in_array($_GET["p"], ["urcita_kategorie", "jina_kategorie"])) {
            $_GET["ak"] = $_GET["p"];
            include("./eshop.php");
        }
    }
}

Nebo

if($_GET["p"]) {
    $text = @mysql_result(mysql_query("SELECT text FROM ".$LOADER["table"]."menu WHERE odkaz = '".$_GET["p"]."'"),0);
    if($text != NULL) {
        echo'<div class="bila">'.$text.'</div>';
    } else {
        if($_GET["p"] == "detail") {
            include("./detail.php");
        } elseif (in_array($_GET["p"], ["eshop", "urcita_kategorie", "jina_kategorie"]) {
            include("./eshop.php");
        }
    }
}

$result = mysql_query("SELECT * FROM ".$LOADER["table"]."vyrobek WHERE kategorie IN (".$_GET["p"].") ");
while ($row = mysql_fetch_assoc($result)) {
.....
}
jiricz
Profil
Keeehi:
Zkoušel jsem obě varianty a ani při jedné se eshop.php nenaincluduje
Keeehi
Profil
jiricz:
Zkoušel jsem obě varianty a ani při jedné se eshop.php nenaincluduje
Hmm ok. To tam asi budeš mích chybu, že? Tak co kdybys ji zkusil najít. Debugger předpokládám nemáš, to by sis to asi už našel sám, takže nejjednodušší jak zjistit, kudy ten program chodí je si na strategických místech vypsat nějaký identifkátor
if (...) {
    echo "aaaa";
    ...
} else {
    echo "bbbb";
    ...
}
Ze stránky si přečteš, co se vypsalo a tím víš, kudy ten program šel. Základem je tedy zjistit jestli se ten program pro ty různé URL ubírá vždy správnou cestou. Pokud ano, tak zjistit, zda se v proměnných nalézá opravdu to, co si myslíš, že se tam má nalézat. Na to se skvěle hodí var_dump($_GET["p"]);
jiricz
Profil
Nakonec jsem to vyřešil trochu jinak. Stačilo to v htaccess upravit takto:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)?/?([^/]+)?/?([^/]+)?/?$ index.php?p=$1&ak=$2&id=$3 [L]

odkazy na stránce jsem poupravil následovně a vše už se zobrazuje dobře. Sice je tam navíc eshop nebo produkt, podle scriptů kde se to vypisuje, ale to mě už nevadí. /eshop/nazev_kategorie nebo /produkt/nazev_kategorie/nazev_produktu.

Jediný problém který jsem objevil je že se mi na konci stromu v kategoriích nevypisují produkty, ale to už je problém jiného scriptu, to bych měl už vyladit.
jiricz
Profil
Tak jsem zjistil, že ještě není všem bojům konec...:D

když jsem si stránky otevřel v anonymním okně, tak jsem zjistil, že nevyřešilo tak úplně vše. Konkrétně to dělá pro mě nepochopitelnou věc. když se otevře stránka neco.web.cz tak se nenačtou css, obrázky, js a i některé includované php na indexu. takže se načte jen nějakých pár odkazů co tam jsou. Jakmile ale jakýkoliv odkaz který tam je (/nejaka_stranka nebo /eshop/nejaka_kategorie) otevřu tak se načte opět jen neco.web.cz ale už úplně normálně se vším všudy a pak už se dá na stránce pracovat úplně normálně.

.htacces vypadá aktuálně takto:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST} [R=301]


RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)?/?([^/]*)?/?([^/]*)$ index.php?p=$1&ak=$2&id=$3 [L]

Snad jsem to popsal srozumitelně. Ví někdo proč se to děje?
Keeehi
Profil
Problém těch hezkých url je, že z hlediska URL jsou to složky. Takže když když se použije relativní adresa třeba css/main.css tak to na /nejaka_stranka a /eshop/nejaka_kategorie ukazuje úplně někam jinam. Stačí tu adresu zapsat absolutně a mělo by to být vše bez problémů.
https://neco.web.cz/css/main.css nebo /css/main.css
jiricz
Profil
Keeehi:
Pravda to mě mohlo samotného napadnout. Aktuálně mám cestu takto /css/styles.css ale zkusím ještě tu absolutní neco.web.cz/css/styles.css

A nějaký důvod proč nejde https když na jiném webu se stejným htaccess to jde? Před úpravou těch url to https šlo. Projel jsem celý kód stránek a nikde nic na http není takže by to nemělo bránit.
Keeehi
Profil
jiricz:
Ony obě cesty jsou absolutní. Pro funkčnost je jedno, zda tam ta doména je nebo není.
Ono popis problému úplně neodpovídal tomu, že by byl problém přímo v cestě. Ovšem spousta lidí má ty cesty relativně a při přechodu na hezké URL pak mají problémy. Proto ačkoli ten popis příznaků úplně neseděl, tak jsem to tipoval spíše na špatný popis problému.
Jelikož tam ale absolutní cestu máš, tak v tom by problém být neměl a bude tedy asi někde jinde. Obávám se ale, že bez konkrétní ukázky problému naživo to nevyřešíme.
jiricz
Profil
Keeehi:
Chápu, že obě cesty jsou absolutní, ale možná se budete divit, při změně na https://neco.web.cz/css/styles.css začalo vše fungovat. A při změně zpět na /css/styles.css to zase nešlo.

Zkusil jsem tdy odstranit z .htaccess toto
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST} [R=301]

A vše fungovalo správně až na to že web byl v http a ne v https. Tak jsem to zkusil prohodit ještě takto:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)?/?([^/]*)?/?([^/]*)$ index.php?p=$1&ak=$2&id=$3 [L]

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST} [R=301]

A vypadá to že to již vše jde bez problému. Zkusím raději ve více prohlížečích na různých pc a uvidí se.
Jinak děkuji za všechny rady:)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0