PHP týden Předvánoční slevová akce
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde
Avatar
MicBlack
Člen
Avatar
MicBlack:2. února 20:13

Ahoj,

chtěl bych někoho poprosit o pomoc s úpravou htaccess. Nedaří se mi nastavit podmínky v htaccess, aby fungoval web.

Zkusil jsem: Hledat info a upravovat htaccess.

Chci docílit: Mám htaccess soubor napsaný dle místního tutoriálu (tedy nastaveno pro prettyUrl) a snažím se tam přidat další podmínku rewriteCond. Ta nová rewriteCond by měla být o tom, že když někdo otevře URL mujweb.cz/site­map.xml, tak se v htaccess přesměruje na soubor v rootu webu 'sitemap.php'.

Můj htaccess je následující:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME] !-d
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]
RewriteRule ^sitemap\.xml$ sitemap.php [L]

AddType application/x-httpd-php .php .phtml
DÍKY!

 
Odpovědět
2. února 20:13
Avatar
SolusLupusUmbra
Redaktor
Avatar
Odpovídá na MicBlack
SolusLupusUmbra:4. února 9:16

ahoj, možná zkusit RewriteRule ^sitemap\.xml$ /sitemap.php [L], přidat to /
Q1: co přesně ti dělá, pokud jdeš na sitemap.xml?
Q2 (optional): Proč chceš měnit sitemap.xml na sitemap.php?

Nahoru Odpovědět
4. února 9:16
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
MicBlack
Člen
Avatar
Odpovídá na SolusLupusUmbra
MicBlack:4. února 10:44

Ahoj,

díky za reakci! - zkusím upravit jak píšeš.
Q1: v tuhle chvíli mě to přesměruje normálně na hlavní stranu .. takže když dám localhost/site­map.xml, skončím na localhost
Q2: Protože bych si chtěl dynamicky vytvářet sitemap, vzhledem k tomu, že na web často přidávám nový obsah a nenapadlo mě zatím efektivnější řešení, než takto.

 
Nahoru Odpovědět
4. února 10:44
Avatar
SolusLupusUmbra
Redaktor
Avatar
Odpovídá na MicBlack
SolusLupusUmbra:4. února 11:18

ještě mě napadlo, zkus https://htaccess.madewithlove.be/, dá se tam ladit htacess

Nahoru Odpovědět
4. února 11:18
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
Odpovídá na MicBlack
Michal Šmahel:4. února 13:49

Ahoj, omlouvám se, že jsem na tebe zapomněl. O této diskuzi už vím delší dobu, jen jsem se nedostal k odpovědi.

Řešení je jednoduché. Stačí pochopit, jak .htaccess funguje. RewriteCond je obdoba podmínky v programování - určuje, zda se provedou "příkazy" pod ní. RewriteRule je zase možné si představit jako "příkaz", který přesměruje určitý formát URL na jiný.

Teď k té funkčnosti:

  • RewriteCond ověří, zda se nejedná o platný soubor (první řádek) nebo platný adresář (druhý řádek).
  • Následují RewriteRule. Ty analyzují aktuální URL a zjistí, jestli s tím "mohou něco udělat" (URL splňuje první regulární výraz). Pokud je výraz splněn, následuje přesměrování na novou adresu (druhý regulární výraz za mezerou). Jakmile se najde ten, který může URL přesměrovat, dále už se nepokračuje.

Co z toho tedy vyplývá pro tebe - první RewriteRule vše, co nekončí vyjmenovanými příponami, přesměruje na index.php. Na druhý RewriteRule se tedy nedostane, protože průběh skončí už u toho prvního. Řešení je prosté - otočit je. Poté bude jako první ověřeno, zda nejde o sitemap a až poté o běžný obsah.

Ještě bych to vylepšil tak, že bych povolil i sitemap bez přípony.

Nahoru Odpovědět
4. února 13:49
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na SolusLupusUmbra
Michal Šmahel:4. února 13:50

Díky za tip. Funguje jim to dobře, do budoucna se určitě bude hodit.

Nahoru Odpovědět
4. února 13:50
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
MicBlack
Člen
Avatar
Odpovídá na Michal Šmahel
MicBlack:4. února 15:25

Děkuju za rady a vysvětlení jak ten htaccess funguje. Ještě jsem zkoušel trochu poupravit svojí implementaci - udělal jsem to tak, že budu mít entrypoint "/sitemap" (to bude můj SitemapController, který bude generovat to xml do šablony). Přijde mi to o něco lepší než, abych to měl v soubor sitemap.php.

Dle návodu jsem si zkoušel hrát s těmi rules v htaccess, ale nepodařilo se mi to udělat, tak jak potřebuju. Pořadí pravidel jsem i otočil, ale nezabralo.:/

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME] !-d
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]
RewriteRule ^sitemap\.xml$ /sitemap [L]

AddType application/x-httpd-php .php .phtml

Mohu poprosit ještě o radu?
- Jak mám ty rules nastavit, aby když někdo přijde na "mojedomena.cz/si­temap.xml", tak mu to načetlo controller "mojedomena.cz/si­temap" ? Nedaří se mi to tam přesměrovat.:/

Když by to takhle fungovalo, tak splňuje přístupnost jak z entrypointu "/sitemap", tak i "/sitemap.xml"

Moc díky!

 
Nahoru Odpovědět
4. února 15:25
Avatar
Odpovídá na MicBlack
Michal Šmahel:4. února 15:58

Mělo by to být nějak takhle. Píšu to zpaměti, takže spoléhám na ten tester. Když by to nefungovalo, napiš, co to dělá a ještě to poladím. Tady to bude nejspíš měnit původní URL, když by to vadilo, muselo by se to napsat trochu jinak.

Nahoru Odpovědět
4. února 15:58
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
SolusLupusUmbra
Redaktor
Avatar
Odpovídá na MicBlack
SolusLupusUmbra:4. února 21:34

vytvořil jsem funkční řešení - podle testeru, zkutečný server se možná bude chovat jinak

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME] !-d
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]

RewriteCond %{REQUEST_URI} /sitemap\.xml
RewriteRule (.*) /sitemap.php [L]

AddType application/x-httpd-php .php .phtml

tester: https://htaccess.madewithlove.be?…

pokud bys chtěl "/sitemap.xml" přesměrovat místo na "/sitemap.php" na "/sitemap", tak pokud ta url existuje, stačí RewriteRule (.*) /sitemap.php [L] změnit na RewriteRule (.*) /sitemap [L]

Nahoru Odpovědět
4. února 21:34
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
MicBlack
Člen
Avatar
Odpovídá na Michal Šmahel
MicBlack:4. února 22:57

Ahoj,

moc díky za pomoc. Použil jsem tvůj kód, přidal pouze [L] na řádek se sitemap a dle testeru to vypadá, že to dělá přesně co bych chtěl - vyhodnotí to ty podmínky správně a vrátí správnou output URL. Akorát když ten kód dám do .htaccess souboru a zkouším to na localhostu, tak to pořád nefunguje. Tedy - když zadám "localhost/si­temap.xml", tak mě to přesměruje na "localhost", namísto toho, aby mě to přesměrovalo na "localhost/si­temap". Přitom tester mi správně vrátí output URL "localhost/si­temap".

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^sitemap\.xml$ /sitemap [L]
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]

AddType application/x-httpd-php .php .phtml

Nemůže být problém v tom, že to zkouším na localhost? Díky!

 
Nahoru Odpovědět
4. února 22:57
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
SolusLupusUmbra
Redaktor
Avatar
Odpovídá na MicBlack
SolusLupusUmbra:5. února 12:24

to, že to je na localhostu, není není problém, ale neměl bys zadat localhost/slozka-kde-je-web/sitemap.xml? samozřejmě záleží, jakou technologii používáš....
PS: sorry za tu gramatickou chybu v mém posledním komentáři

Nahoru Odpovědět
5. února 12:24
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
MicBlack
Člen
Avatar
Odpovídá na SolusLupusUmbra
MicBlack:5. února 20:36

Ahoj,

ten sitemap.xml mám uložený přímo v root adresáři - tam kde mám index.php a .htaccess;
Moc nerozumím tomu, jak tedy funguje ten online htaccess tester - tam mi to ten kód korektně vyhodnocuje, ale reálně pak ne.

 
Nahoru Odpovědět
5. února 20:36
Avatar
SolusLupusUmbra
Redaktor
Avatar
SolusLupusUmbra:5. února 20:48

ten tester funguje v php - tj. soustava if a switch
problém, že by něco mělo v htaccesu fungovat, ale ve skutečnosti nefunguje, jsme v práci taky řešili...
zkoušel jsi ten můj kod pro htaccess?

Nahoru Odpovědět
5. února 20:48
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
Odpovídá na MicBlack
Michal Šmahel:6. února 14:00

Jde o to, že .htaccess funguje v závislosti na verzi Apache. Ještě můžeš zkusit nastavit RewriteBase na root.

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^sitemap\.xml$ /sitemap [L]
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]

AddType application/x-httpd-php .php .phtml
Nahoru Odpovědět
6. února 14:00
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na MicBlack
Michal Šmahel:6. února 14:02

Pokud to stále nepůjde, dej vědět. Sednu k tomu a něco vymyslím. Ono to bude třeba vyzkoušet, jak to tak vypadá.

Nahoru Odpovědět
6. února 14:02
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
MicBlack
Člen
Avatar
Odpovídá na Michal Šmahel
MicBlack:7. února 10:19

Ahoj, tak jsem zkusil i to - nastavit RewriteBase na root a nepomohlo.

 
Nahoru Odpovědět
7. února 10:19
Avatar
MicBlack
Člen
Avatar
Odpovídá na SolusLupusUmbra
MicBlack:7. února 10:20

Jo tak, takže ten tester je pouze orientační (škoda).. Jj, zkoušel jsem i ten tvůj htaccess, ale taky nefungovalo.

 
Nahoru Odpovědět
7. února 10:20
Avatar
Odpovídá na MicBlack
Michal Šmahel:7. února 15:10

No, tak jsem se na to pořádně podíval a sepsal dvě funkční řešení - delší a zkrácené. Nejprve je uvedu a poté vysvětlím, kde byl problém.

Delší řešení:

# Spusteni Rewrite engine a nastaveni na root
RewriteEngine On
RewriteBase /

# Trvale presmerovani /sitemap.xml --> /sitemap
RewriteCond %{REQUEST_URI} ^/sitemap\.xml$
RewriteRule ^sitemap\.xml$ /sitemap [R=301,L]

# Presmerovani veskereho provozu na index.php (krome platnych adres)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]

# Pridani pripony .phtml pro PHP
AddType application/x-httpd-php .php .phtml

Zkrácené řešení:

# Spusteni Rewrite engine a nastaveni na root
RewriteEngine On
RewriteBase /

# Presmerovani veskereho provozu na index.php (krome platnych adres)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Vyjimka - trvale presmerovani sitemap.xml --> /sitemap
RewriteRule ^sitemap\.xml$ /sitemap [R=301,L]
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]

# Pridani pripony .phtml pro PHP
AddType application/x-httpd-php .php .phtml

Tedy k věci. Mé předchozí konfigurace byly téměř správné, jen jsem si neuvědomil "moc" flagu L. Tento flag (nebo prostě vlajka) totiž určuje poslední pravidlo před vykonáním (L = Last). Zjednodušeně řečeno: pokud máš někde uveden flag L (na konci řádku v hranatých závorkách), říkáš tím, že pokud je pravidlo splněno, již se dále nepokračuje a výstup se rovnou zpracuje. Určuje to tedy jistou prioritu při zpracování. Další chybou bylo vynechání flagu pro trvalé přesměrování (trvalý přesun) R=301. R v tomto případě znamená Redirect a 301 je potřebný HTTP kód. Trvalé přesměrování je zde potřebné k tomu, aby se změnila požadovaná adresa (REQUEST_URI), kterou posléze využívá tvůj PHP systém.

Co tak dívám na poslední zdrojový kód, stačí doplnit flag R=301. Toho flagu L sis nejspíše všiml dříve než já. Když by tě problematika více zajímala, můžeš si pročíst dokumentaci od Apache.

Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět
7. února 15:10
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
MicBlack
Člen
Avatar
Odpovídá na Michal Šmahel
MicBlack:7. února 16:38

Perfektní, vše konečně funguje jak má! Díky moc za pomoc a vysvětlení funkčnosti!

 
Nahoru Odpovědět
7. února 16:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.