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


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?
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/sitemap.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.
Ondřej Němec:4.2.2019 11:18
ještě mě napadlo, zkus https://htaccess.madewithlove.be/, dá se tam ladit htacess
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.
Michal Šmahel:4.2.2019 13:50
Díky za tip. Funguje jim to dobře, do budoucna se určitě bude hodit.
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/sitemap.xml", tak mu to načetlo controller
"mojedomena.cz/sitemap" ? 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!
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.
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]
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/sitemap.xml", tak mě to přesměruje na "localhost", namísto toho, aby mě to přesměrovalo na "localhost/sitemap". Přitom tester mi správně vrátí output URL "localhost/sitemap".
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!
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
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.
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?
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
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á.
MicBlack:7.2.2019 10:19
Ahoj, tak jsem zkusil i to - nastavit RewriteBase na root a nepomohlo.
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.
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.
+20 Zkušeností
MicBlack:7.2.2019 16:38
Perfektní, vše konečně funguje jak má! Díky moc za pomoc a vysvětlení funkčnosti!
Zobrazeno 19 zpráv z 19.

