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

Člen

Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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?
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.
ještě mě napadlo, zkus https://htaccess.madewithlove.be/, dá se tam ladit htacess
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:
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.
Díky za tip. Funguje jim to dobře, do budoucna se určitě bude hodit.
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!
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.
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]
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!
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
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?
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
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á.
Ahoj, tak jsem zkusil i to - nastavit RewriteBase na root a nepomohlo.
Jo tak, takže ten tester je pouze orientační (škoda).. Jj, zkoušel jsem i ten tvůj htaccess, ale taky nefungovalo.
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.
Perfektní, vše konečně funguje jak má! Díky moc za pomoc a vysvětlení funkčnosti!
Zobrazeno 19 zpráv z 19.