Autor | Zpráva | ||
---|---|---|---|
jiricz Profil |
#1 · Zasláno: 29. 4. 2019, 19:09:52
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 Dále mám například pro zobrazení detailu produktu url takovouto: web.cz/?p=detail&id=1129&ak=237 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 |
#2 · Zasláno: 29. 4. 2019, 21:51:35
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 |
#3 · Zasláno: 30. 4. 2019, 00:07:58
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 neco.web.cz/?p=detail&ak=nazev_kategorie&id=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 |
#4 · Zasláno: 30. 4. 2019, 09:27:13
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 |
#5 · Zasláno: 30. 4. 2019, 19:57:30
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> |
||
Davex Profil |
#6 · Zasláno: 1. 5. 2019, 13:25:29
jiricz:
Jak se parametr ?p= do adresy dostal, když v odkazech není?
|
||
Beavis Profil |
#7 · Zasláno: 1. 5. 2019, 16:19:00
jiricz:
Nemáte zacachované šablony? |
||
jiricz Profil |
#8 · Zasláno: 1. 5. 2019, 17:20:45
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 |
#9 · Zasláno: 1. 5. 2019, 18:50:28
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 |
#11 · Zasláno: 1. 5. 2019, 21:19:22
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 |
#12 · Zasláno: 1. 5. 2019, 21:58:07
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 |
#13 · Zasláno: 1. 5. 2019, 22:05:20
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 |
#14 · Zasláno: 1. 5. 2019, 22:56:36
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 |
#16 · Zasláno: 2. 5. 2019, 10:32:09
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"); } } } 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 |
#18 · Zasláno: 2. 5. 2019, 14:39:03
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"; ... } var_dump($_GET["p"]);
|
||
jiricz Profil |
#20 · Zasláno: 2. 5. 2019, 20:05:37
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 |
#21 · Zasláno: 4. 5. 2019, 10:16:53
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 |
#22 · Zasláno: 4. 5. 2019, 11:05:38
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 |
#23 · Zasláno: 4. 5. 2019, 21:14:18
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 |
#24 · Zasláno: 5. 5. 2019, 02:18:05
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 |
#25 · Zasláno: 5. 5. 2019, 10:00:26
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:) |
||
Časová prodleva: 5 let
|
0