Autor Zpráva
vašek
Profil *
Ahoj,

v souboru .htaccess mám mimo jiné toto:

# presmerování na verzi bez prípony, pokud ješte není prepsáno a není to POST požadavek
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.(php|html)$ https://moje.adresa.cz/$1 [R=301,L,NE]
 
# podstrcení PHP, prepsat pouze na existující skript
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$    $1.php    [L]
 
# podstrcení HTML, prepsat pouze na existující soubor
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^.]+)$    $1.html    [L]

a když jsem si spustil program Xenu na analyzování odkazů, viděl jsem v jeho reportu v tamní záložce "Site Map of valid HTML pages with a title", že se mi dublují odkazy, ale pokaždé s jiným názvem. Proč je název pokaždé jiný? Některé vyhledávače ve svém SERPu pak zobrazují ten nechtěný dublovaný název...

V reportu Xenu to vypadá nějak takhle:

Stránka 1 (odkaz vede na https://moje.adresa.cz/stranka1.php)
Správný název stránky 1 (odkaz vede na https://moje.adresa.cz/stranka1)

Stránka 2 (odkaz vede na https://moje.adresa.cz/stranka2.php)
Správný název stránky 2 (odkaz vede na https://moje.adresa.cz/stranka2)

Takhle to pokračuje pro všechny mé stránky.

A některé vyhledávače v SERPu ukazují "Stránka 1", kdežto další ukazují preferované "Správný název stránky 1" - resp. ty odkazy s koncovkou .php jsou v reportu programu Xena v podobě rozsypanéhop čaje (tzn. nefunguje správně kódování), ale ty odkazy bez koncovky .php se v reportu programu Xena zobrazují se správnou diakritikou... Ty odkazy bez koncovky .php obsahují název uvedený ve stránce mezi tagy <title>, ty odkazy s koncovkou .php zobrazují název vzatý neznámo odkud (většinou z tagu <h1>, ale není podmínkou).

Když se v reportu Xenu potom podívám na záložku "Statistics for managers", vidím i počet URL dvakrát větší, než odpovídá reálnému stavu (to proto kvůli zmíněnému dublování, kterého bych se rád zbavil).

Jinak sitemap.xml na webu nemám.
Kajman
Profil
Neexistující title může být textem odkazu odkazujího na .php variantu adresy stránky. Pořádně si zkontrolujte, že nikde neodkazujete na adresy končící .php a .html.
vašek
Profil *
Kajman:
Pořádně si zkontrolujte, že nikde neodkazujete na adresy končící .php a .html.
Děkuji za radu. Můžete mi prosím říct, jak toho dosáhnu? Mezi jednotlivými stránkami používám výhradně relativní odkazy, které vždy končí koncovkou .php či .html (tady ale tuším zakopaný pes nebude).
Keeehi
Profil
vašek:
tady ale tuším zakopaný pes nebude
Právě že asi bude. To je přesně to co ti Kajman psal že si máš zkontrolovat že se neděje.

Navíc při procházení tvého webu posílá návštěvník naprosto zbytečně dvojnásobný počet požadavků, jelikož při každém z nich ho nejdříve dokážeš na verzi s .php z které je následně ihned přesměrován na vezi bez .php. Odkazy bys tedy měl mít rovnou na verzi bez .php.
vašek
Profil *
Keeehi:
Ah tak. Děkuji za upřesnění. Bohužel slyším za 15 let existence mých stránek poprvé, že na soubor "stranka1.php" se dá odkazovat jako "stranka1" (což mi pořád nedává smysl, ale věřím vám oběma).

Čili jinak: jde daná záležitost vyřešit automatizovaným procesem buď v souboru .htaccess nebo alespoň v programu Dreamveawer (verze tuším 2005)? Něco jako pravidlo "když má relativní odkaz koncovku .php nebo .html, tu koncovku mu smaž. Absolutní odkazy vedoucí ven nech beze změny".

Přepisovat ručně adresy všech relativních odkazů nepřichází v úvahu, to to radši nechám v současném stavu :-).

P.S. začíná mi to odkazování stranka1.php jako stranka1 dávat smysl, protože před těmi 15 lety mi nějak vůbec nefungovaly stránky na localhostu, když jsem tam měl soubor .htaccess. Proto soubor .htaccess na localhostu nemám, zatímco na webu ano (takže na localhostu vidím koncovku .php a na webu už ne).

Zkusím dát do localhostu soubor .htaccess ve znění v prvním příspěvku, jen řádek 5 upravím tak, aby obsahoval absolutní adresu na localhost.
Kajman
Profil
.htaccess Vám odkazy ve stránce neopraví. To přesměrování (řádek 5) má být jen pro opravu adres z jiných webů či záložek uživatelů, kde nemůžete opravit odkaz, aby byl bez přípony.

Pokud můžete dělat v obsahu webu náhrady regulárním výrazem, tak by to mohlo jít hromadně.

Na lokálním stroji ste si možná zapomněl nastavil v konfiguraci serveru
AllowOverride
tak .htaccess není povolen. Podstrkávací pravidla je možné dát i přímo do konfigurace serveru.
vašek
Profil *
Kajman:
Děkuji za informace. Zjistil jsem, že:

1) níže zmíněný kód v .htaccess na localhostu nic nedělá. Není třeba problém v tom, že zatímco web mám na doméně 3. řádu, XAMPP je defaultně nastaven na doménu 2. řádu (nevím, jen hádám)? Na localhostu mám stránky i .htaccess na C:\Program Files\xampp\htdocs\web

AllowOverride All
RewriteEngine On
 
# presmerování na verzi bez prípony, pokud ješte není prepsáno a není to POST požadavek
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.(php|html)$ /$1 [R=301,L,NE]
 
# podstrcení PHP, prepsat pouze na existující skript
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$    $1.php    [L]
 
# podstrcení HTML, prepsat pouze na existující soubor
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^.]+)$    $1.html    [L]

2) Dreamweaver používat regulární výrazy umí. Mohl bych Vás požádat o formulaci náhrady regulárním výrazem v návaznosti na bod 3?

3)
a) odkazuji ven absolutním odkazem - tyto odkazy by se neměly měnit. Zrovna tak by se neměly měnit odkazy na Javascript atd.

b) občas odkazuji <a href="/">text odkazu</a> a tyto odkazy by se také neměly měnit

c) většinou odkazuji <a href="nejaka-stranka.php">text odkazu nějaké stránky</a> a tyto odkazy by se měly změnit

d) pro dosud zmíněné body používám různé atributy a kotvy (nevím, jestli na tom záleží) a přípona souboru je jak .php, tak .html

e) ten zbytek odkazů, který nepokrývá bod c) si dokážu snadno hromadně změnit sám (bez použití regulárního výrazu) - jedná se o stránky, které nejsou v rootu a které načítám pouze skrz iframe nestandardním způsobem

Pokud nějakou podstatnou věc chcete vědět, prosím, zeptejte se (aneb určitě jsem v mých bodech nezahrnul všechny varianty odkazů a jejich struktury).

Na přímou konfiguraci serveru se necítím - tuším, že by to dopadlo špatně :-(

P.S. z výše uvedeného kódu pro .htaccess jsem vyjmul "AllowOverride All", otevřel si C:\Program Files\xampp\apache\conf, spustil soubor httpd.conf, nahradil AllowOverride none za AllowOverride All v části
<Directory />
    AllowOverride All
    Require all denied
</Directory>
, ale pořád na localhostu nevidím žádnou změnu v koncovkách - pořád se zobrazují.
Kajman
Profil
V mém editoru bych zkusil změnil
href="([^".]+)\.php"
za
href="$1"
Jiný editor se může na referenci odkazovat jinak než dolarem.

Po změně konfigurace je potřeba apache restartovat. Pokud to ani potom nebude fungovat, zkuste pohledat další výskyty AllowOverride.
vašek
Profil *
Kajman:
Děkuji.

Snad už poslední věc před tím, než zkusím doporučenou náhradu regulárním výrazem: z URL na localhostu sice zmizela koncovka .php, ale objevila se stránka 404. To asi proto, že v tomto .htaccess

RewriteEngine On
 
# presmerování na verzi bez prípony, pokud ješte není prepsáno a není to POST požadavek
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.(php|html)$ /$1 [R=301,L,NE]
 
# podstrcení PHP, prepsat pouze na existující skript
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$    $1.php    [L]
 
# podstrcení HTML, prepsat pouze na existující soubor
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^.]+)$    $1.html    [L]

se místo localhost/web/stranka v URL zobrazí jen localhost/stranka. Zkoušel jsem upravit zápis jednoho řádku na RewriteRule web/^(.+)\.(php|html)$ /$1 [R=301,L,NE], ale to nikam nevedlo.

Můžu Vás poprosit o zanesení "web/" do URL localhostu skrze .htaccess?

P.S. předpokládám, že pro .html stránky bude platit změna odkazu ve tvaru

href="([^".]+)\.html"

za

href="$1"
Kajman_
Profil *
Na localhostu zkuste přidat za RewriteEngine On
RewriteBase /web/

Ale osobně bych to neopravoval. Alespoň hned uvidíte, že jste někde nechal starý odkaz, který máte nahradit.

To by se dalo najít i v logu apache. Na localhost pustíte např. httrack, aby stáhl celou stránku a pak se podíváte do logu, jestli tam nebyl požadavek na .php nebo .html koncovku.
vašek
Profil *
Kajman:
Děkuji, vyzkouším RewriteBase /web/.

Alespoň hned uvidíte, že jste někde nechal starý odkaz, který máte nahradit.
Tomu moc nerozumím - když v URL na localhostu nebudu mít to "web/" a soubor stranka.php budu mít v Apachi ve složce "web" (konkrétně tady: C:\Program Files\xampp\htdocs\web), tak si myslím, že jakýkoliv odkaz povede na stránku s kódem 404 - jako se mi to právě stalo (právě proto, že místo localhost/web/stranka v se v URL zobrazí jen localhost/stranka - ale stranka.php není v rootu localhost, ale v rootu složky s názvem web). Po náhradě odkazů to stejně proženu programem Xenu, takže bych měl vidět, které stránky jsou pořád dvojité (tzn. mám někde u nich změnit odkaz)...

Mezitím jsem si cvičně zkoušel náhradu regulárním výrazem a jako takové to funguje (i s mým předpokladem, tedy záměnou přípony). Ale nenajde to kotvy/záložky, které jsem zmiňoval v příspěvku [#7] pod bodem 3d. Budete tak laskav a zašlete mi prosím i verzi náhrady reg. výrazem pro kotvy?


Kajman:
Tak bohužel RewriteBase /web/ za RewriteEngine On neřeší problém - URL zůstává pořád localhost/stranka místo localhost/web/stranka, takže se po kliknutí na odkaz zobrazí stránka s 404.

Co je pro mě zajímavé je to, že když najedu myší na ten kliknutej odkaz, vidím adresu localhost/web/stranka. nicméně po kliknutí vidím v adresním řádku prohlížeče tu zmíněnou adresu localhost/stranka (tedy stránku s 404).
Kajman
Profil
Pokud máte domaštěné odkazy, co vyžadují být v rootu webu, tak si můžete udělat virtualhost (najděte si sám, neumím to psát z hlavy). Je také možné, že si prohlížeč pamatuje 301 předešlé přesměrování, proto se pro testování nemá 301 používat, jen 302. A opakuji, že na localhostu bude lépe, když přesměrování (řádky 4 -8) nebudete používat.

Regulár by mohl být
href="([^".]+)\.(php|html)(["?#])
za
href="$1$3
vašek
Profil *
Kajman:
A opakuji, že na localhostu bude lépe, když přesměrování (řádky 4 -8) nebudete používat.
Pardon, na poprvé jsem to patrně přehlédl či nepochopil. Mrzí mne, že jste to musel psát vícekrát. Důvodem, proč bych chtěl mít pokud možno identické .htaccess na webu i localhostu je i identické chování stránek.

Když v .htaccess pro localhost zpětně vyjmu RewriteBase /web/ a řádky 4-8 dám do komentáře, pořád vede např. odkaz <a href="/">homepage</a> na "domovskou stránku Apache" - tedy localhost/xampp místo požadovaného localhost/web. Zkusil jsem v httpd.conf přepsat defaultní ServerRoot "C:/Program Files/xampp/apache" na ServerRoot "C:/Program Files/xampp/htdocs/web", ale tím jsem si odrovnal celýho Apače (nešlo ani načíst localhost/web v prohlížeči)...

Nevím jak to funguje, ale myslím si, že kdyby Apač pochopil, že má být root složka web, místo toho svého defaultního rootu, mohly by být soubory .htaccess identické pro web i localhost... Každopádně děkuju za pomoc, bez RewriteBase /web/ a s řádky 4-8 v komentářích se soubory .htaccess chovají dost podobně.

Regulár by mohl být
href="([^".]+)\.(php|html)(["?#])
za
href="$1$3

Deafultně to nachází i odkazy bez kotev, ale tím, že nejprve použiju ten první reg. výraz z příspěvku [#8], tento druhý reg. výraz už najde pouze odkazy s kotvami (alespoň doufám).

Takže ještě jednou děkuju za pomoc. Změny relativních odkazů otestuju na localhostu, přesměrování (řádky 4-8) či odkazy <a href="/">homepage</a> pak otestuju až u ostré verze na webu.


Respektive tím, že reg. výraz z příspěvku 12 nachází jak relativní odkazy s kotvami tak i rel. odkazy bez kotev, se nemusí reg. výraz z příspěvku 8 vůbec používat :-).
Kajman
Profil
vašek:
pořád vede např. odkaz <a href="/">homepage</a> na "domovskou stránku Apache"

Ale to muselo i před povolením .htaccess. Pokud chcete jít na adresář, ve kterém je aktuální stránka, tak můžete použít odkaz
<a href="./">homepage</a>
Ale pokud je tem více zanoření, už musíte vyskákat nahoru. / je univerzálnější a používám to raději, ale je potřeba si nastavit vhodně lokální webserver.
vašek
Profil *
Kajman:
Ale to muselo i před povolením .htaccess.
To ano. Bez vloženého .htaccess do localhostu jsem to tak nějak očekával. Když jsem se po tolika letech odhodlal k vložení .htaccess i do localhostu, myšlenkou bylo mít identické chování stránek, tj. i identické soubory .htaccess.

Jak jste nejednou zmínil, záležitost jde rukou v ruce nastavením lokálního webserveru. Návod pro virtualhost nalezený na internetu nevypadá na první pohled příliš složitě. Navíc tam je obrázek, jak restartovat Apache z kontrolního panelu XAMPP :-)

Kdo ví, třeba se někdy pokusím nastavit lokální webserver tak, aby mohly být soubory .htaccess na webu i localhostu identické.

Každopádně současný stav dovoluje vyřešit primární problematiku tohoto vlákna (děkuji pěkně), tak se radši momentálně nebudu pouštět do žádnejch větších akcí :-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0