Autor Zpráva
HonzaPl
Profil
Ahoj,

s linuxem jsem začal pracovat nedávno a řeším následující problém. Nahrál jsem na linuxový server soubory s diakritikou, ale v prohlížeči se nezobrazují, místo toho naskočí 404 se zkomoleným názvem (pro ěščřžýáíé.jpg -> ěščřžýáíé.jpg was not found on this server).

Jak se v linuxu neorientuji, zkoušel jsem hledat na internetu, ale nenašel jsem žádné řešení. Přepsal bych soubory ručně, ale je jich moc, a navíc na ně směřují odkazy z webu.

Existuje nějaké nouzové řešení, jak tento problém vyřešit?

Děkuju, Honza
okolojsoucí
Profil *
JPW - Jména souborů
Nepoužívejte češtinu ve jménech souborů a adresářů. Jestli to někde funguje, neznamená to, že to bude fungovat všude. Název stránky kočička.html je nešťastný. Lepší je kocicka.html
• Nepoužívejte mezery. Musíte-li odkázat na soubor s mezerou, musíte v adrese mezeru nahradit řetězcem "%20". Například soubor hezke odkazy.html se odkazují jako
hezke%20odkazy.html.
HonzaPl
Profil
Díky, já to vím, já jsem ty soubory tak nepojmenovával :) Ale situace je taková, že čeština v názvu souborů prostě je.

Proto se ptám, jestli s tím jde teď něco udělat?
Kajman
Profil
HonzaPl:
Existuje nějaké nouzové řešení, jak tento problém vyřešit?

Odkaz na obrázek správně escapovat. Např. v php existuje funkce
urlencode()
HonzaPl
Profil
Díky, tohle mě nenapadlo, protože stránky jsou částečně statické...v nejhorším případě bych to ale musel předělat...

A na straně serveru (Linux, Apache) není žádná možnost, jak nastavit, aby server interpretoval diakritiku správně?
Davex
Profil
HonzaPl:
A na straně serveru (Linux, Apache) není žádná možnost, jak nastavit, aby server interpretoval diakritiku správně?
Server interpretuje diakritiku správně, jenom se s názvy souborů musí pracovat ve stejném kódování jako je nastaveno na serveru a běžně se používá kódování UTF-8. Pokud budou stránky s odkazy na soubory ve stejném kódování, tak by to mělo fungovat bez problémů. V jiném kódování to fungovat nebude.

Možná tam jsou soubory nahrané se špatnými názvy nebo server používá nějaké zastaralé kódování.
HonzaPl
Profil
Davex:

Soubory jsou původem z Win serveru, stažené na počítač s Win7 a poté nahrány na Linux server. Zkoušel jsem přijít na kódování souborů na linuxu pomocí enca, ale výsledkem bylo Unrecognized encoding. Jak tedy zajistit dobré kódování souborů? Díky
Davex
Profil
HonzaPl:
Když vypíšeš obsah adresáře přímo na serveru příkazem ls, tak je diakritika správně?

Zkoušel jsem přijít na kódování souborů na linuxu pomocí enca, ale výsledkem bylo Unrecognized encoding.
Enca se snaží odhadnout kódování textu v souborech a pokud žádné nerozezná, tak by to mohlo naznačovat, že to nejsou textové soubory. Máš-li tam nějaké webové stránky, tak v nich by se kódování rozeznat mělo.
HonzaPl
Profil
Davex: Ano, diakritika je správně, když si vypíšu soubory pomocí ls. Když je otevřu např. pomoci WinSCP nebo přes prohlížeč přes upravenou adresu pomocí urlencode(), tak se zobrazí správně.

S tou encou máš pravdu, já si to neuvěodmil a zkoušel jsem to na obrázky :(
DarkMeni
Profil
HonzaPl:
Nahrál jsem na linuxový server soubory
Ten server je přes Apache?

zkus třeba něco jako:
- vytvořit si soubor test_diakritiky.php
<?php
header('Content-Type: Text/Plain;Charset=UTF-8');
var_dump($_GET);
?>
- a soubor .htaccess
RewriteEngine on
RewriteRule (.*) test_diakritiky.php?nazev_souboru=$1 [QSA]
Ale to ti vyřadí ostatní stránky, tak to zkus radši dát třeba do nějaký složky

A koukni se co ti to vypíše když zadáš: http://adresa.cz/slozka/Něco s diakritikou

Jestli to bude dobrý, tak pak máš na serveru nastavený kódování na utf-8, a když ne, tak pak tam máš jiný kódování
A podle toho můžeš buď přispůsobit kódování serveru nebo kódování stránek (to zkomolení se stane i když tu adresu zadáš do prohlížeče ručně - jakože bez kliknutí na odkaz?)

Ale vypadá to že na serveru máš nastavený kódování Windows-1252 (Západní jazyky) a prohlížeč předá serveru adresu v UTF-8 (ale na to se asi nedá spolehnout, třeba nějakej jinej to předá v jiným kódování a pak to bude zase zkomolený)
Takže nejspolehlivější by bylo asi přejmenovat ty soubory, a nebo když se ti do toho nechce tak doufat že všechny prohlížeče předávaj adresu v UTF-8 a v httpd.conf si upravit (nebo dopsat, jestli to tam není):
AddDefaultCharset utf-8
A nebo když na to nemáš oprávnění, tak do .htaccess dát:
IndexOptions +Charset=UTF-8
(kdyžtak tu změnu kódování pro server řešil někdo tady)
HonzaPl
Profil
DarkMeni:
Ano, je to Apache.
Vyzkoušel jsem tvoji radu - diakritika takto normálně funguje, funguje i v DB. Dokonce i ve zdrojáku se např. obrázky objevují s diakritikou, problém je, že se nezobrazují.
A ano, to zkomolení se stane, když adresu zadám ručně do prohlížeče. Děkuju

Ale - zkoušel jsem includovat php soubor, který se jmenoval "š.php", a v pohodě se vložil. Nicméně example.com/š.php už háže chybu.
Kajman
Profil
HonzaPl:
protože stránky jsou částečně statické

Escapujte tedy odkazy i ve statických částech.
HonzaPl
Profil
Kajman:
Odkazů na obrázky je na tisíce... jak?

Navíc bych to radši vyřešil nastavením serveru. Zkoušel jsem to na webhostingu a tam to (také na linuxu) jde - tzn. nějak to musí jít, jen bych potřeboval nakopnout jak...
Amunak
Profil
HonzaPl:
Hádám, že jsou prostě špatně escapované ty adresy na statických stránkách. Pokud je moc velký problém to předělat na dynamické, vždycky můžete přejmenovat soubory třeba tak, že jejich názvy projedete přes nějaké md5, a stejně tak všude v kódu nahradit ta jména těmi checksumy (pokud nejsou escapovaná, resp. jsou shodná s tím, jak to vypadá ve výpisu ve filesystému, tak to půjde i automatizovaně třeba přes sed).
HonzaPl
Profil
Amunak:
DíkyJak jsem psal výše, problémem nejsou odkazy ze statických stránek, problemém je, že server háže 404, když chci otevřít soubor s diakritikou.

Vypadá to, že problém je v nastavení, konkrétně v locale apod.:
/$ locale
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

i18n:
LANG="cs_CZ.UTF-8"
SYSFONT="latarcyrheb-sun16"
LC_ALL="cs_CZ.UTF-8" //přidal jsem já
Amunak
Profil
HonzaPl:
Pokud ti to funguje s urlencode, ale ne na statických stránkách, tak je chyba v těch statických stránkách - adresa je tam prostě zapsaná špatně. Na straně serveru to nezmění žádné nastavení. Linuxová locale ovlivňuje jen jazyk systému, formát měny a podobně.
HonzaPl
Profil
Amunak:
Teď si trochu nerozumíme - funguje mi zobrazení samotného obrázku (s názvem např. ščř.png) v prohlížeči, pokud jeho název nejprve převedu pomocí urlencode (na %C5%A1%C4%8D%C5%99.png). Ale pokud zadám přímo ščř.png, pak dostanu 404 chybu. A stejně se to projevuje i ve statických stránkách, ale to spolu souvisí a přidáním urlencode() do statických stránek problém nevyřeším - to je jen nouzové řešení pro stránky, ne pro samotné zobrazování souborů s diakritikou :(

Ok, když to nebude v locale, je nějaké nastavení na serveru, které by to mohlo řešit?

Trochu jsem zkoušel a chování problému je tedy následující:
http://example.com/š.php - Nefunguje
http://example.com/test.php obsahující include("š.php") - Funfuje, obsah souboru š.php se vloží do test.php
http://example.com/test.php?a=ěščřžý - přes GET se předává hodnota "ěščřžý" ve správném tvaru
Amunak
Profil
HonzaPl:
Ok, když to nebude v locale, je nějaké nastavení na serveru, které by to mohlo řešit?
Těžko.

A stejně se to projevuje i ve statických stránkách, ale to spolu souvisí a přidáním urlencode() do statických stránek problém nevyřeším - to je jen nouzové řešení pro stránky, ne pro samotné zobrazování souborů s diakritikou :(
To není nouzové řešení, to je jediné správné řešení. URL mají prostě určitý systém enkódování speciálních znaků, který je nutné dodržovat, pokud chceš, aby ti to fungovalo. Když zadáš přímo do prohlížeče http://example.com/test.php?a=ěščřžý, tak to funguje proto,že za tebe prohlížeč ty znaky enkóduje. V HTML to za tebe ale nikdo neudělá, musíš to mít rouvnou správně zapsané.

Proto se taky doporučuje nepoužívat diakritiku - nemuíš pak (skoro) nic enkódovat (escapovat). Prostě budeš muset mít odkazy ve stylu <a href="%C5%A1%C4%8D%C5%99.png">...</a>, nebo můžeš nepoužívat diakritiku. Jiné správné řešení snad ani neexistuje.
HonzaPl
Profil
Amunak:
Pořád mi nerozumíš - já neřeším odkazy v rámci HTML stránky, já řeším otevření samotného souboru v prohlížeči (neotvírám example.com/index.html, ale example.com/š.php). Vzhledem k tomu, že to na jiném hostingu funguje, existuje určitě způsob, jak toho dosáhnout i tady na tomto serveru. A já se ptám, jestli někdo ví, kde bych měl hledat nastavení, které se toho týká...
Kajman
Profil
Pokud url neescapujete a zadáte do prohlížeče či html stránky přímo š.php, tak nemáte kontrolu na tím, v jakém kódování ji prohlížeč escapuje sám při odesílání na server.
HonzaPl
Profil
Kajman:
Ok, takže to nemůžu ovlivnit? Protože když zcela stejným způsobem nahraju stejný soubor na 2 různé linuxové hostingy, na jednom soubor s diakritikou přímo otevřu ze stejného prohlížeče (Chrome) a na druhém ne. V čem je tedy háček?

Díky za všechny reakce, jsem docela amatér a snažím se tomuto přijít na kloub a pochopit to celé.
Amunak
Profil
Ok, takže to nemůžu ovlivnit?
Můžeš - vyescapuješ to správně ve stránce.
HonzaPl
Profil
Amunak:
Na jaké stránce, když chci otevřít pouze obrázek? Příkladem může být logo seznamu: http://www.seznam.cz/st/img/2011//logo.png
Amunak
Profil
HonzaPl:
Na té statické stránce. Pořád se bavíme o tom samém. Já se ti snažím vysvětlit, že když chceš, aby to spolehlivě fungovalo, musíš to mít zapsané podle nějaké konvence - tedy musíš to mít správně escapované. A ty se tady pokoušíš to pořád nějak obcházet.

Příkladem může být logo seznamu
Nemůže, logo seznamu nemá v názvu ani cestě diakritiku. Pokud chceš otevřít obrázek v prohlížeči, a napíšeš jeho URL do adresního řádku, prohlížeč to za tebe vyescapuje "na pozadí", a ty si ničeho nevšimneš, obrázek se normálne zobrazí, v adresním řádku bude http://example.com/ěščřžů.jpg, ale ve skutečnosti prohlížeč pošle požadavek ve stylu http://example.com/%C4%9B%C5%A1%C4%8D%C5%99%C5%BE%C5%AF.jpg. Když máš v HTML kódu odkaz, tak se o správné escapování staráš ty, ne prohlížeč. Musíš si tu konverzi pohlídat sám.

Výhodnou alternativou je nepoužívat v názvech souborů diakritiku...
HonzaPl
Profil
Amunak:
Logo seznamu jsem uváděl jako příklad, jak potřebuji otvírat obrázky -> že tam žádná statická stránka není.

1. Chápu, že používat diakritiku v názvech souborů je zlo (ale BFU...)
2. Do budoucna se už bude pracovat výhradně se soubory bez diakritiky.
3. Chápu, že co bych chtěl, není správné řešení, ale technicky to prostě možné udělat zpětně nelze (tyhle adresy jsou v tisících stránkách, v DB, PDFkách, tištěných dokumentech)

Ale pokud to na jiném serveru funguje, tak to nějakým způsobem musí jít nastavit i na tomto serveru, a na to jsem se ptal...

Děkuji ti za rady ohledně toho, jak to vyřešit do budoucna, budu se toho držet, ale to řešíš něco jiného.
DarkMeni
Profil
Zkoušel si do httpd.conf přidat řádek AddDefaultCharset UTF-8?
Nebo možná taky záleží na tom, jestli je ten jazyk na serveru nainstalovanej, nevim kde se to má hledat, ale možná je někde složka jako třeba LANG/LC_ALL/en_EN nebo tak nějak
Davex
Profil
HonzaPl:
Ano, diakritika je správně, když si vypíšu soubory pomocí ls.

$ locale
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

Domnívám se, že s tímhle nastavením se jména souborů nemůžou příkazem ls vypsat správně. Není ani obvyklé instalovat server s tímto nastavením. Podle toho odhaduji, že to nebude server, ale virtuální server instalovaný z nějaké šablony. Doporučuji změnit POSIX na en_US.UTF-8 nebo cs_CZ.UTF-8.

Když je otevřu např. pomoci WinSCP nebo přes prohlížeč přes upravenou adresu pomocí urlencode(), tak se zobrazí správně.
Ty soubory na server nahráváš také přes WinSCP? Je v něm zapnuté používání UTF-8 ve jménech souborů. Ta zakódovaná adresa, která funguje opravdu vypadá takhle? %C5%A1%C4%8D%C5%99.png To by mělo být úplně stejně, jak zakóduje diakritiku prohlížeč.
HonzaPl
Profil
DarkMeni:
Zkoušel, resp. byl tam už od začátku. Na ty jazyky mrknu.

Davex:
Aha, navedl jsi mě asi na chybu.
WinSCP dává opravdu locale, jaký jsem psal, ale Putty:
[root@localhost ~]# locale
LANG=cs_CZ.UTF-8
LC_CTYPE="cs_CZ.UTF-8"
LC_NUMERIC="cs_CZ.UTF-8"
LC_TIME="cs_CZ.UTF-8"
LC_COLLATE="cs_CZ.UTF-8"
LC_MONETARY="cs_CZ.UTF-8"
LC_MESSAGES="cs_CZ.UTF-8"
LC_PAPER="cs_CZ.UTF-8"
LC_NAME="cs_CZ.UTF-8"
LC_ADDRESS="cs_CZ.UTF-8"
LC_TELEPHONE="cs_CZ.UTF-8"
LC_MEASUREMENT="cs_CZ.UTF-8"
LC_IDENTIFICATION="cs_CZ.UTF-8"
LC_ALL=

Navíc ls pomocí Putty už zobrazí "?.php", nikoliv "š.php" - takže možná WinSCP mi trochu s těmi názvy pomáhal, ale ve skutečnosti jsou špatně, že?

A ano, soubory nahrávám přes WinSCP. Ta zakódovaná adresa tak fungovala včera, dnes už ne (nejspíš jsem tam ještě něco dalšího rozhodil:/).
Davex
Profil
HonzaPl:
A ano, soubory nahrávám přes WinSCP. Ta zakódovaná adresa tak fungovala včera, dnes už ne (nejspíš jsem tam ještě něco dalšího rozhodil:/).
Tak to by potom bylo jasné. Přes WinSCP se vytvářejí názvy souborů v jiném kódování než UTF-8.

V nastavení programu WinSCP by mělo pomoci zapnout v profilu ve volbě Environment / UTF-8 encoding for filenames On.
HonzaPl
Profil
:(

Zjistil jsem, v čem byl problém - ve mně. Při logování přes WinSCP jsem nastavil SCP místo SFTP - tím se to celé pokazilo. Přepnul jsem to, znova se nalogoval a všechny chyby v názvech byly krásně vidět, jako v Putty. Zkušebně jsem přehrál pár souborů a fungují :) Teď mám tu volbu UTF-8 encoding for filenames danou jako Auto a funguje to...
Moc děkuju za pomoc!

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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