Autor Zpráva
CZghost
Profil
Zdravím. Před nějakou dobou jsem se ptal ChatGPT na rady ohledně přesměrování s překladem lomítek v URL adrese do query stringu a zpět, a napsalo mi to celkem uvěřitelné a uspokojivé informace, společně i s vysvětlením, jak to funguje. V dokumentaci Apache ty nejdůležitější aspekty nejsou, a zatím jsem neměl čas to pořádně prozkoušet na localhostu, což však udělám. Ale napsalo mi to verzi Apache 2.4.0, ve které by měly být takové funkce obsažené. Jsou takové informace, co mi ChatGPT poskytlo, pravdivé? Může to fungovat?

Dosavadní konverzaci s ChatGPT si lze přečíst zde: chat.openai.com/share/7651a4b5-9780-4d82-a72c-2e19c1b2d97f

Po bližším prozkoumání to vypadá, že jsou tam nepřesnosti, takže si ani nejsem jistý, jestli je něco takového vůbec možné. Dělal někdo už něco podobného? Jak jste tento problém vyřešili?
blaaablaaa
Profil
CZghost:
Čeho se snažíte docílit? Pokud uživatel něco zadá do formulářového pole a odešle GETem, tak se lomítko automaticky převede. Pokud je někde odkaz, tak už ho můžete převést. Jak jinak by se do URL mohlo dostat?
CZghost
Profil
No, snažím se docílit překladu adres. To znamená, aby v pozadí to fungovalo tak, že se přistupuje na učitou PHP stránku, a do parametru path se vložila adresa prozkoumávané části úložiště (downloads). Ale chci, aby to fungovalo tak, že se uživateli zobrazí uživatelsky přívětivá URL, kde místo něčeho jako https://share.czghost.cz/root.php?path=quake3%2Fmaps%2Fczq3dm1.zip se zobrazí něco na způsob https://share.czghost.cz/root/quake3/maps/czq3dm1.zip. První způsob je to, co bude interně fungovat na backendu, ale zobrazí se ten druhý způsob. A potřebuju aby se překládalo mezi oběma formáty. Klasické přesměrování na ten druhý způsob, který je poté interně přesměrován zpět na ten první. Soubor .htaccess automaticky lomítka nepřekládá v URL právě, respektive si tím nejsem zcela jistý.


Ptal jsem se jinak také na podpoře webhostingu Endora, kde mám webové stránky: podpora.endora.cz/viewtopic.php?id=16571

Ptám se z toho důvodu, jelikož jsem si kupoval doménu a chci si svůj starý web z free hostingu převést na novou adresu.
Keeehi
Profil
Otázka je, proč to potřebuješ obousměrně. Jasně, potřebuješ ppžadavek z hezké url poslat na root.php. Ale k čemu by měl sloužit ten druhý směr? Ten je potřeba jen v případě, že dříve jsi hezké url nepoužíval a odkazy se starou ošklivou verzí už někde visí na internetu a ty nemáš možnost je změnit. A navíc máš potřebu, že když už někdo přes takový odkaz přijde, tak mu to v url změnit na tu novou verzi. Což mi přijde už takové trochu zbytečné, když už tu je. Ale pokud to je nový projekt a nikde na internetu ty staré verze ještě nejsou, pak to vůbec nemusíš řešit.
CZghost
Profil
Tak obousměrně mám webové stránky řešené už teď, je to když to tak řeknu moje úchylka. O to však nejde, jde o ten samotný překlad. I kdyby to bylo jednosměrně (bez aktivního přesměrování odkazu podle skutečného interního řešení na hezkou variantu), tak potřebuju vyřešit ten automatický překlad těch lomítek. Pokud se to překládá automaticky už v prohlížeči, nebo si to automaticky přelouská Apache nějak, pak je to asi v pořádku, a stačí mi to udělat tak, jak jsem to měl předtím (jen zkrátka bez překladu na hezké adresy z těch interních).
CZghost
Profil
Tak jsem to zkusil podle toho, co mi ChatGPT vyplivlo, a nefunguje to.

Soubor .htaccess:
# No directory listing, no multi views
Options -Indexes

# Redirects and rewrites allowed
RewriteEngine on

# Redirect HTTP to HTTPS
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]

# Redirect direct requests for "index.php?lang=xyz" to "/xyz/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} lang=([a-z]{2,3})
RewriteRule ^(index\.php)?$ https://%{HTTP_HOST}/%1/? [R=301,L]

# Redirect direct requests for "root.php?lang=xyz" to "/xyz/root/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} lang=([a-z]{2,3})
RewriteRule ^(root\.php)$ https://%{HTTP_HOST}/%1/root/? [R=301,L]

# Redirect direct requests for "root.php?lang=xyz&path=<anything>" to "/xyz/root/<anything>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} lang=([a-z]{2,3})
RewriteCond %{QUERY_STRING} path=(.+)
RewriteRule ^(root\.php)$ https://%{HTTP_HOST}/%1/root/%{QUERY_STRING_UNESCAPED:path}? [R=301,L,NE]

# Redirect direct requests for "root.php?path=<anything>" to "/root/<anything>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} path=(.+)
RewriteRule ^(root\.php)$ https://%{HTTP_HOST}/root/%{QUERY_STRING_UNESCAPED:path}? [R=301,L,NE]

# Redirect direct requests for "index.php" to "/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php$ https://%{HTTP_HOST}/? [R=301,L]

# Redirect direct requests for "root.php" to "/root/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^root\.php$ https://%{HTTP_HOST}/root/? [R=301,L]

# Redirect "/xyz/root" to "/xyz/root/" (with the slash at the end)
RewriteRule ^([a-z]{2,3})/root$ ./root/? [R=301,L]

# Internally rewrite "/xyz/root/" to "/root.php?lang=xyz"
RewriteRule ^([a-z]{2,3})/root/$ ./root.php?lang=$1 [L]

# Encode forward slashes in query string
#RewriteCond %{QUERY_STRING} ^(.*&|\?)path=([^&]*)(.*)$
#RewriteRule ^ - [E=PATH_ENCODED:${urlencoder:$2}]

# Internally rewrite "/xyz/root/<anything>" to "/root.php?lang=xyz&path=<anything>"
#RewriteRule ^([a-z]{2,3})/root/(.+)$ ./root.php?lang=$1&path=%{ENV:PATH_ENCODED}
RewriteRule ^([a-z]{2,3})/root/(.+)$ ./root.php?lang=$1&path=${urlencoder:$2} [B,L]

# Internally rewrite "/xyz/" or "/xyz/index/" to "/index.php?lang=xyz"
RewriteRule ^([a-z]{2,3})(/(index/?)?)?$ ./index.php?lang=$1 [L]

# Internally rewrite "/index/" to "/index.php"
RewriteRule ^index/?$ ./index.php [L]

# Internally rewrite "/root/" to "/root.php"
RewriteRule ^root/$ ./root.php [L]

# Encode forward slashes in query string
#RewriteCond %{QUERY_STRING} ^(.*&|\?)path=([^&]*)(.*)$
#RewriteRule ^ - [E=PATH_ENCODED:${urlencoder:$2}]

# Internally rewrite "/root/<anything>" to "/root.php?path=<anything>"
#RewriteRule ^root/(.+)$ ./root.php?path=%{ENV:PATH_ENCODED} [B,L]
RewriteRule ^root/(.+)$ ./root.php?path=${urlencoder:$2} [B,L]

Soubor root.php (testovací, skutečný obsah bude jiný):
<!DOCUMENT HTML>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Hello World</title>
    </head>
    <body>
        <h1>Test: Hello World</h1>
        <ol>
            <li>Language selector: <?php echo $_GET['lang']; ?></li>
            <li>Path selector: <?php echo $_GET['path']; ?></li>
        </ol>
    </body>
</html>

No a takto vypadá výsledek:


V path selectoru má být napsáno test.

Vypadá to, že se budu muset vrátit k původnímu způsobu a zkrátka zapomenout na překlad skutečných adres na hezké. Pokud by vás napadlo, jak to vylepšit, budu jedině rád.
Kajman
Profil
Zkoušejte si postupně přidávat jedno pravidlo za druhým.

Pro zkoušení používejte redirect 302, protože 301 si prohlížeč zapamatuje a po opravě pravidla bude přesměrovávat stejně jako dřív.

Pište pravidla od konkrétnějších po obecnější.

Zkontrolujte si v dokumentaci apache, že existují proměnné, které se snažíte použít (QUERY_STRING_UNESCAPED).

Pokud chcete používat rewrite mapy (${urlencoder:$2}), tak je musíte definovat.
CZghost
Profil
Právě QUERY_STRING_UNESCAPED jsem tam nenašel, tak netuším, jak to funguje.

Rewrite mapy jsem doposud neznal, zdá se tedy, že ChatGPT si něco naštudovalo, ale nějak zkomolilo výstup (zapomnělo tam tu rewrite mapu definovat).

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0