Část 01 Crash Course htaccess v Urdu 2017: Úvod do .htaccess | DirectoryIndex | ErrorDocument

Apache 2.4.10 ve Windows. Mám stabilní aplikaci PHP Zend Framework 1. Právě jsem se rozhodl přidat ErrorDocument směrnice do .htaccess. Jsem úplně zmatený třemi různými způsoby chování, které mám u 404, podle toho, jak jsou spuštěny.

Můj soubor .htaccess obsahuje:

ErrorDocument 404 'Page not found' RedirectMatch 404 /uploads/(.*/)?private/ 

Pokud jednoduše zadám adresu URL pro neexistující stránku do adresního řádku, zobrazí se chybová stránka vytvořená Zend Framework ErrorController.

Pokud vstoupím /uploads/private/foo (odpovídá RedirectMatch), pak dostanu ErrorDocument výstup, jak se očekávalo.

Ale pokud v mém kódu PHP ano

http_response_code(404); exit(0); 

pak se mi zobrazí standardní chybová stránka prohlížeče. To je ten, kterému naprosto nerozumím. Pokud používám kartu Síť v nástrojích pro vývojáře Chrome, vidím, že všechny tři žádosti dávají stav 404. Myslím, že si dokážu představit, že nastavení zpracování chyb Zend Framework by zachytilo neexistující adresu URL a udělalo by to, obejde ErrorDocument zpracovává se. Ale nechápu, jak okamžité exit z kódu PHP se stavem 404 by se dostal přes ErrorDocument.

Jaký kód PHP mohu napsat, abych spustil ErrorDocument směrnice?

UPRAVIT:

Na základě odpovědi od Tim Fountain bych měl uvést více kontextu: Jak je uvedeno výše, můj ZF ErrorController stránka je nastavena tak, aby vypadala tak, jak chci - tuto stránku vidím, když zadám adresu URL neexistující stránky. V této konkrétní situaci vlastně spouštím kód z WordPressu mu-plugin (WP je nainstalován pod ZF public adresář). The .htaccess soubor přirozeně nesměřuje požadavky na existující soubory níže public do ZF. Žádosti o cokoli níže public/wp místo toho jdi na public/wp/index.php The mu-plugin bootstraps ZF (ale nevolá bootstrap run() metoda) a poté požadavek prozkoumá. Pokud to není povoleno (podle proměnných relace Auth ZF), chci dát 404 (ne 403). Dříve jsem to udělal přesměrováním na neexistující URL a to ukázalo ErrorController stránka v pohodě - ale také opustil adresní řádek zobrazující neexistující URL. Rozhodl jsem se přidat ErrorDocument směrnice, aby se v adresním řádku stále zobrazovala adresa URL zadaná uživatelem. Ve svém skutečném kódu jsem neměl na směrnici jednoduchý řetězec, ale spíše tuto adresu URL: /default/error/error?error_handler[type]=404. Změnil jsem to na jednoduchý řetězec, abych se ujistil, že na adrese URL není problém, který by způsoboval problém. Všimněte si, že když zadám URL pro něco v rámci private adresář spouštějící RedirectMatch, Vidím ZF ErrorController stránka, takže vím, že adresa URL sama o sobě není problém. Chtěl jsem jen snížit složitost tohoto zveřejnění.

Timova odpověď říká, že můj problémový kód posílá prázdnou stránku 404 přímo do prohlížeče a prohlížeč ji mění na vysvětlující text. To se jasně děje!

Znamená to, že mým problémem je, že musím vytvořit nějaký obsah stránky s nenulovou délkou a použít ji header() nastavit stav, protože http_response_code() posílá prázdný obsah přímo do prohlížeče? Co je však v jeho odpovědi nejasné, je důvod ErrorDocument směrnice by byla obejita.

URL požadavku způsobující toto chování je http://www.example.com/wp/foo. The DocumentRoot je .../public. Toto není přepsáno .htaccess přejít na ZF, ale přejde přímo na public/wp/index.php. V takovém případě bych si myslel, že ErrorDocument bude spuštěno ...

ÚPRAVA 2:

Nebo počkejte, možná Timův bod není ve skutečnosti o zpracování chyb ZF, ale že z pohledu Apache byl příchozí požadavek uspokojen (přechodem na public/wp/index.php a běh PHP), takže je na kódu PHP, aby to zvládl, nemohu se vrátit k Apache ErrorDocument potom! Myslím, že jsem měl opravdu zásadní nedorozumění o tom, jak ErrorDocument funguje. Musím přijít na nějaký způsob, jak vyvolat ErrorController kód přímo k zobrazení stránky, kterou chci, se stavem 404! Duh!

Myslím, že přijmu Timovu odpověď, i když chce objasnit / zobecnit svůj názor na to, kdy ErrorDocument do hry vstupuje zpracování, to by bylo hezké :-)

ÚPRAVA 3:

Jen to zabalit. Přijal jsem Timovu odpověď, protože odhalila mé zásadní nepochopení toho, jak Apache ErrorDocument směrnice funguje. Ale to mi přímo neukázalo, jak vyřešit problém, který jsem zažíval, s objevem, že jsem chtěl vrátit stav 404 pomocí své vlastní stavové stránky Zend Framework, ale běžel jsem v dotazu WordPress s bootstrapped ZF, aniž bych spustil MVC aplikace běžící pod bootstrapem. Neměl jsem žádné zkušenosti s předním ovladačem ZFs, ale po trochu kopání do dokumentů jsem přišel s tímto řešením, které má přesně stejný účinek jako plný ErrorDocument Směrnice, kterou jsem chtěl zakopnout.

$error_url = $this->serverUrl() . '/default/error/error?error_handler[type]=404'; $request = new Zend_Controller_Request_Http($error_url); $front = Zend_Controller_Front::getInstance(); $front->returnResponse(true); $response = $front->dispatch($request); $response->setRawHeader('HTTP/1.1 404 Not Found'); $response->sendResponse(); exit(0); 

Pravděpodobně ve svých pravidlech htaccess máte také pravidlo přepsání, které směruje všechny požadavky na Zend Framework. V tomto okamžiku Apache (a ErrorDocument) není ve skutečnosti na obrázku, protože jste mu řekli, že chcete, aby požadavky zpracovával PHP.

Když to uděláte:

http_response_code(404); exit(0); 

do prohlížeče odesíláte prázdnou stránku 404. Mnoho prohlížečů je nastaveno tak, aby zobrazovalo svou vlastní uživatelsky přívětivou stránku 404, pokud je velikost stránky 404, kterou obdrží ze serveru, menší než X bajtů. (Jen pro lepší uživatelský zážitek.)

Zend Framework by to měl chytit a v závislosti na použít vlastní chybovou stránku kde vložíte tento kód PHP (a případně na základě některých možností konfigurace).

Navrhuji vám aktualizovat stránku Zend Framework ErrorController tak, aby vypadala, jak chcete. Nevěřím, že existuje způsob, jak ručně zpracovat požadavek zpět na Apache (jak to bylo).

Pracoval pro vás: Charles Robertson | Chcete nás kontaktovat?