Autor Zpráva
Jozin
Profil *
Zdravím,

píšu si takovou malou aplikaci a zalíbila se mi možnost Routování v PHP. V htaccess jsem napsal jen přesměrování na index.php, který se postará o překlad adresy a vykreslení správných věcí (jsem to ještě funguje).

Nyní jsem začal s třídou, která bude generovat odkazy, aby když náhodou nebude htaccess na serveru fungovat, tak aby použil klasickou adresu ?module=modul...

Tady se dostávám ke svému problému. Jak zjistím z PHP, jestli htaccess funguje?

V htaccess vše, co není soubor nebo složka směřuji na index.php bez query. Napadlo mě, že bych tam dal index.php?ht=1. To je sice fajn, ale aplikace při generování klasických query adres může obsahovat takovou proměnnou a pak by to fungovalo špatně. Hledám tudíž nějaké řešení přímo v PHP.

Předem moc děkuji i za malé nakopnutí, (btw: googlil jsem už hodně dlouho. Buď používám špatné keywordy, nebo to nikdo neřešil)

čauko Jozin.
Kajman_
Profil *
Zkusil bych si např. stáhnout data z example.com/htaccess_test a podle vráceného obsahu zjistil, jestli se routování povedlo. Pokud v php nebude povolen přístup přes http, tak lze tento test spustit ajaxem (skript si pak něco zapamatuje) případně nechat kliknout uživatel na testovací odkaz.
Jozin
Profil *
Kajman:
Děkuji za odpověď,

stáhnutí htaccess mi nepomůže. Routování nepojede, dokud nezjistím, jestli má generovat query adresy, nebo pěkné adresy... To že si přečtu obsah toho souboru mi moc nepomůže. Nebo jsem to špatně pochopil, možná si to myslel jinak.

Testovací odkaz. No nedokážu si představit, že by každý uživatel musel klepnout na testovací odkaz, aby se mohl kouknout na stránku.

Ale z toho co si psal mě napadlo, že bych mohl udělat Mock třídu a při příchodu na stránku, se requirne pomocí hezké adresy a vyzkouší se, jestli mám přístupnou třídu (nebo funkci), pokud ne použijí se query adresy. Kajman co říkáš na toto?

Ještě jednou děkuji za odpověď. A kdyby ještě někoho něco napadlo, prosím dejte vědět. Toto řešení se mi zdá neohrabané
Jozin
Profil *
Tak jsem zjistil, že s tou Mock třídou to nějak nejde :-D
Jozin
Profil *
Tak jsem to vyřešil úplně jinak, kdyby to někdo taky řešil, tak tady je moje řešení.

V hlavním souboru jsem si definoval cestu k souboru .htaccess (kdyby mě napadlo ho přesunout). Poté, když potřebuji zjistit, jestli tedy bude htaccess fungovat napíšu následující:

if(file_exists(HTACCESS_FILE) && in_array('mod_rewrite', apache_get_modules()))


Děkuju Kajman za pomoc... chvilku po tom, co jsem odeslal poslední příspěvek mi došlo, jak si to myslel... Tak děkuju
meris
Profil
Přemyšlím, k čemu to potřebuješ testovat při každém spuštění stránek? Myslíš, že se ti bude měnit nastavení serveru pod rukama?
Podle mého je v tomto případě rozumnější si při každé instalaci nastavit do nějakého konfigu zda se mají na daném serveru generovat url pro .htaccess nebo bez něj.
Tvé poslední řešení sice ověři, že je povolený .htaccess a že existuje soubor.. ale také se může stát, že tam nebude definován regulární výraz pro zpracování odkazů. Takže je to řešení jen napůl cesty a stejně se spoléháš na to že to bude správně nastaveno člověkem.
A není pak už jednoduší řešení nastavit přímo že se má použít mod_rewrite v configu?
Davex
Profil
Jozin:
Jak psal meris, tak přítomný soubor .htaccess nezaručuje správně nastavená přepisovací pravidla. Pokud PHP poběží na serveru jako CGI/FastCGI, tak zhavaruje druhá část, protože funkce apache_get_modules() nebude existovat.

V podstatě potřebuješ jen zjistit, zda se změnila původní cesta v URL.

if (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) !== $_SERVER['PHP_SELF']) {
  /* přepsáno*/
} else {
  /* nepřepsáno */
}
Jozin
Profil *
Ahoj znovu,

meris: Znáš například webzdarma? Dejme tomu, že kamarádovi dělám aplikaci, ale nechci se už starat o to, že mu třeba změní na serveru nastavení a já to budu muset měnit ručně. To řešení se spoléhá na to, že .htaccess je ten .htaccess, který jsem tam dal. Pokud si to ten, komu sem to dal změní, tak se stejně rozpadnou routy... nemám to tak dobře řešené... postupně to budu upravovat a možná takovou kontrolu naprosto odstraním. Mnou napsaný systém třeba dám někomu na web a za měsíc se třeba server aktualizuje a zapnou mu podporu rewrite... a hned se odkazy a adresy změní na hezčí..

Davex: Nějak nepředpokládám, že bych PHP zkompiloval a dal na server. Problém s tím, jestli apache_get_modules bude existovat, jsem řešil, ale nenašel jsem, že by to nemělo fungovat možná v tom CGI. Mimo jiné jsem vyzkoušel to co jsi napsal, ale jak s vypnutým tak se zapnutým mod_rewrite a i zrušení .htaccess to zkončí ve větvy přepsáno...

Oboum dvoum moc děkuji za reakce... zvážím teda jiné řešení.

Čauko Jozin
Davex
Profil
Jozin:
Problém s tím, jestli apache_get_modules bude existovat, jsem řešil, ale nenašel jsem, že by to nemělo fungovat možná v tom CGI.
Až hosting změní nastavení z Apache modulu na FastCGI nebo se skript přesune na jiný hosting, tak může přestat fungovat. Není dobré napevno používat funkce, které jsou závislé na nastavení serveru.

Mimo jiné jsem vyzkoušel to co jsi napsal, ale jak s vypnutým tak se zapnutým mod_rewrite a i zrušení .htaccess to zkončí ve větvy přepsáno...
Asi jsi to zkoušel špatně, protože když odstraníš .htaccess, tak by mělo náhodné neexistující URL skončit chybou 404. Ale uznávám, že v určitých situacích může toto rozpoznání selhat (třeba pokud tam jsou další přepisovací pravidla).
Jozin
Profil *
Davex:
No ony to nemusí být ani přepisovací pravidla... příklad: "http://www.example.com/" REQUEST je "/" a PHP_SELF "/index.php". A právě tato chyba mi nedovoluje to použít. Potřeboval bych vědět při napsání první adresy... to znamená na index, zda je mod_rewrite zapnutý a za předpokladu, že tam mám svůj htaccess, tak mohu odkazy generovat jako ty "hezké".

Btw: Koukal jsem na Nette a tam to funguje naprosto správně. Zajímalo by mě, jak to mají dělané. Snažím se to nějak dohledat, ale ty zapozdření jsou opravdu rozsáhlá a trošku se v tom už ztrácím (co už jsem prošel, jestli to dělá to co si myslím). Jestli třeba někdo neví, jak je to řešené tam...

Ale opět děkuji za odpověď, zase vím trošku víc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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