IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: htaccess - přidání rewriteCond na sitemap

Aktivity
Avatar
MicBlack
Člen
Avatar
MicBlack:2.2.2019 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.2.2019 20:13
Avatar
Ondřej Němec
Tvůrce
Avatar
Odpovídá na MicBlack
Ondřej Němec:4.2.2019 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.2.2019 9:16
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
MicBlack
Člen
Avatar
Odpovídá na Ondřej Němec
MicBlack:4.2.2019 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.2.2019 10:44
Avatar
Ondřej Němec
Tvůrce
Avatar
Odpovídá na MicBlack
Ondřej Němec:4.2.2019 11:18

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

Nahoru Odpovědět
4.2.2019 11:18
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
Odpovídá na MicBlack
Michal Šmahel:4.2.2019 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.2.2019 13:49
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na Ondřej Němec
Michal Šmahel:4.2.2019 13:50

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

Nahoru Odpovědět
4.2.2019 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.2.2019 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.2.2019 15:25
Avatar
Odpovídá na MicBlack
Michal Šmahel:4.2.2019 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.2.2019 15:58
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Ondřej Němec
Tvůrce
Avatar
Odpovídá na MicBlack
Ondřej Němec:4.2.2019 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.2.2019 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.2.2019 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.2.2019 22:57
Avatar
Ondřej Němec
Tvůrce
Avatar
Odpovídá na MicBlack
Ondřej Němec:5.2.2019 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.2.2019 12:24
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
MicBlack
Člen
Avatar
Odpovídá na Ondřej Němec
MicBlack:5.2.2019 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.2.2019 20:36
Avatar
Ondřej Němec
Tvůrce
Avatar
Ondřej Němec:5.2.2019 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.2.2019 20:48
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
Odpovídá na MicBlack
Michal Šmahel:6.2.2019 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.2.2019 14:00
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na MicBlack
Michal Šmahel:6.2.2019 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.2.2019 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.2.2019 10:19

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

 
Nahoru Odpovědět
7.2.2019 10:19
Avatar
MicBlack
Člen
Avatar
Odpovídá na Ondřej Němec
MicBlack:7.2.2019 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.2.2019 10:20
Avatar
Odpovídá na MicBlack
Michal Šmahel:7.2.2019 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.2.2019 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.2.2019 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.2.2019 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.