Autor Zpráva
nulovamezera
Profil
Zdravím.
Chtěl bych docílit toho, aby mojí HTML stránku před odesláním klientovi server projel a "vyřešil" PHPko, ale aby klient nedokázal poznat, že jsem ten kód nějak zpracovával. Tzn. aby:
1. Content-Type byl text/html a
2. Aby přípona / koncovka souboru byla .html.

Napadlo mě něco jako "AddType text/html .php" nebo obráceně, tedy "AddType text/php .html" nebo "AddType application/php .html" v .htaccess.
Bojím se, že bych tím vyřešil jenom jednu z těch dvou věcí.

Děkuji za rady
N71
Profil *
Klient obecně nepozná, že stránku zpracoval PHP (content type bude text/html vždycky když neřekneš jinak). Samozřejmě koncovka URL může napovědět, což lze vyřešit pomocí modu rewrite nebo i tvým způsobem (ale pak budeš zpracovávat všechny .html soubory, a to není obvyklé).


Zapomněl jsem ještě na direktivu expose_php, která přidává do hlaviček X-Powered-By: PHP/… — tu můžeš vypnout v php.ini.
nulovamezera
Profil
Já mám dost rád skládání stránek pomocí php include, přijde mi to asi jako nejlepší možnost, takže prakticky každou webovou stránku zpracovávám.

Když teda použiju můj způsob, tak co mám použít? Čekal bych to druhý nebo třetí. Já se ale bojím toho, že když to použiju, tak klientovi přijde to XXX/php.

Co je direktiva, co expose_php, a co php.ini? Nevím, jestli mám k nějakému php.ini přístup, jelikož to běží na webhostingu. Ale myslím si, že X-Powered-By bych asi přežil.
Děkuji
N71
Profil *
Jestli ti jde jen o koncovku v URL, tak použij ten rewrite. To je nejjednodušší: Rewrite .html to .php using mod_rewrite
nulovamezera
Profil
Děkuji, vyzkouším, a pak dám vědět.
nulovamezera
Profil
Funguje to. Když se zeptám na stránku /2.html, tak server najde stránku /2.php, zpracuje to PHPko v ní, a vrátí mi to s hlavičkou text/html, ale pořád v prohlížeči uvidím 2.html. Nevím ale, proč to funguje. Můžu poprosit o vysvětlení?
Děkuji
PS: Je lepší říkat PHPko nebo PHPčko?


Proč se vůbec používá to ^? A co jest !-f a !-d?
N71
Profil *
Rewrite překládá adresy podle nastavených pravidel. Pravidla s podmínkami -f a-d kontrolují, jestli adresa nevyhovuje nějakému existujícími souboru/adresáři (pokud ano, adresa se v tomto případě nepřepíše — to abys mohl používat i normální .html soubory.
nulovamezera
Profil
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ $1.php?%{QUERY_STRING} [L]

Takže jsem to pochopil takhle: Nejdřív to zkontroluje, jestli se takhle náhodou nejmenuje nějaký soubor (první řádek). Pak jestli se tak nejmenuje složka (druhý řádek). Když žádný takový soubor / složka není, tak se to pustí do přepisování (třetí řádek):
Zpětné lomítko escapuje tečku, dolar znamená konec názvu. Před tím je libovolný počet libovolných znaků, které se uloží do proměnné 1. Poté se vytáhne proměnná 1, za ní se plácne .php, a teď to přestávám chápat. Pokaždé se tam objeví otazník, a za to se ještě připlácne jakýsi QUERY_STRING. To jsou věci odesílané třeba formulářem? Nedalo by se to řešit třeba tak, že tam nebude ten dolar? Nebo bych tam ještě přicpal (.*)? (bez otazníku)
Když tam není [R], tak se mi v prohlížeči zobrazí stará adresa obsahující .html, to jsem pochopil. To [L] znamená, že do takto upravené adresy pak žádný další RewriteRule nemůže zasáhnout? A proč se používá to ^?

Děkuji moc
blaaablaaa
Profil
nulovamezera:
Lepší mi přijde tohle:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ $1.php [L,QSA]

Flag QSA v tomto případě být nemusí, Querystring (parametry za ? ... třeba tvojeadresa.html?promenna=hodnota) se přidá automaticky.
Pokud bys ale měl pravidlo třeba RewriteRule ^(.*)\.html$ $1.php?dalsi=hodnota, tak by se už promenna=hodnota dále nepředala. Flag QSA zaručí, že se aktuální querystring za adresu připojí.
Viz httpd.apache.org/docs/2.4/rewrite/flags.html a vyzkoušet si to můžeš třeba na htaccess.madewithlove.be

^(.*)\.html$ je regex (viz třeba cheatography.com/davechild/cheat-sheets/mod-rewrite), stříška značí začátek stringu.
nulovamezera
Profil
Zkusil jsem to podle blaaablaaa, funguje to jak bez QSA, tak s tím. Když jsem zkusil RewriteRule ^(.*)\.html$ $1.php?presmerovano=1 [L,QSA], tak to php nenašlo, ale ostatní proměnné to normálně četlo, to samé bez QSA.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0