Del 01 htaccess Crash Course i Urdu 2017: Introduktion til .htaccess | DirectoryIndex | ErrorDocument

Apache 2.4.10 på Windows. Jeg har en stabil Zend Framework 1 PHP-applikation. Jeg besluttede bare at tilføje en ErrorDocument direktiv til .htaccess. Jeg er helt forbløffet over de tre forskellige adfærd, jeg får med 404'erne, afhængigt af hvordan de udløses.

Min .htaccess-fil indeholder:

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

Hvis jeg bare skriver en url for en ikke-eksisterende side i adresselinjen, får jeg fejlsiden produceret af Zend Framework's ErrorController.

Hvis jeg går ind /uploads/private/foo (matcher RedirectMatch), så får jeg ErrorDocument output, som forventet.

Men hvis jeg gør det i min PHP-kode

http_response_code(404); exit(0); 

så får jeg browserens standardfejlside. Dette er den, jeg fuldstændig undlader at forstå. Hvis jeg bruger fanen Netværk i Chrome Developer-værktøjer, kan jeg se, at alle tre anmodninger giver en 404-status. Jeg gætter på, at jeg kan forestille mig, at Zend Framework's fejlhåndteringsopsætning ville fælde den ikke-eksisterende url og gøre sit ved at omgå ErrorDocument forarbejdning. Men jeg forstår ikke, hvordan en øjeblikkelig exit fra PHP-kode med en status på 404 ville komme forbi ErrorDocument.

Hvilken PHP-kode kunne jeg skrive for at udløse ErrorDocument direktiv?

REDIGERE:

Baseret på svaret fra Tim Fountain skal jeg give mere sammenhæng: Som nævnt ovenfor, min ZF ErrorController siden er indstillet til at se ud, som jeg vil - jeg ser den side, når jeg indtaster en URL til en ikke-eksisterende side. I denne særlige situation kører jeg faktisk kode fra en WordPress mu-plugin (WP er installeret under ZF public vejviser). Det .htaccess filen dirigerer naturligvis ikke anmodninger om eksisterende filer nedenfor public til ZF. Anmodninger om noget nedenfor public/wp i stedet gå til public/wp/index.php Det mu-plugin bootstraps ZF (men kalder ikke bootstrap's run() metode) og undersøger derefter anmodningen. Hvis det ikke er tilladt (i henhold til ZF's Auth-sessionsvariabler), vil jeg give en 404 (ikke 403). Tidligere gjorde jeg dette ved faktisk at omdirigere til en ikke-eksisterende URL, og det viste ErrorController side fint - men det efterlod også adresselinjen, der viser den ikke-eksisterende URL. Jeg besluttede at tilføje ErrorDocument direktivet, så adresselinjen stadig viser den URL, der er skrevet af brugeren. I min faktiske kode havde jeg ikke en simpel streng i direktivet, men snarere denne URL: /default/error/error?error_handler[type]=404. Jeg ændrede det til en simpel streng bare for at sikre, at der ikke var noget ved URL'en, der forårsagede et problem. Bemærk, at når jeg indtaster en URL til noget inden for en private mappe, der udløser RedirectMatch, Jeg ser ZF ErrorController side, så jeg ved, at URL'en i sig selv ikke er et problem. Jeg ville bare reducere kompleksiteten for dette indlæg.

Tims svar siger, at min problemkode sender en tom 404-side direkte til browseren, og browseren ændrer den til forklarende tekst. Det er helt klart, hvad der sker!

Betyder dette, at mit problem er, at jeg har brug for at producere noget sideindhold, der ikke er nul, og bruge det header() for at indstille status, fordi http_response_code() sender tomt indhold direkte til browseren? Men hvad der er uklart i hans svar er hvorfor ErrorDocument direktivet ville blive omgået.

URL'en til anmodningen, der forårsager denne adfærd, er http://www.example.com/wp/foo. Det DocumentRoot er .../public. Dette omskrives ikke af .htaccess at gå til ZF, men går direkte til public/wp/index.php. I hvilket tilfælde ville jeg have troet, at ErrorDocument ville blive udløst ...

REDIGER 2:

Eller vent, måske handler Tims punkt ikke rigtig om ZF-fejlhåndtering, men det fra Apache's synspunkt blev den indgående anmodning opfyldt (ved at gå til public/wp/index.php og kører PHP), så det er op til PHP-koden at håndtere det, jeg kan ikke komme tilbage til Apache's ErrorDocument efter det! Jeg gætter på, at jeg havde en virkelig grundlæggende misforståelse af, hvordan ErrorDocument fungerer. Jeg er nødt til at finde ud af en eller anden måde at påberåbe mig ErrorController kode direkte for at få vist den side, jeg vil have en 404-status! Duh!

Jeg antager, at jeg accepterer Tims svar, men hvis han vil præcisere / generalisere sit synspunkt om hvornår ErrorDocument behandling kommer i spil, det ville være rart :-)

REDIGER 3:

Bare for at afslutte dette. Jeg accepterede Tims svar, fordi det afslørede min grundlæggende misforståelse af, hvordan Apache ErrorDocument direktiv fungerer. Men det viste mig ikke direkte, hvordan jeg skulle løse det problem, jeg oplevede, ved at opdage, at jeg ønskede at returnere en 404-status ved hjælp af min Zend Framework-tilpassede statusside, men jeg kørte i en WordPress-forespørgsel efter at have bootstrapped ZF uden at have startet MVC-applikation, der kører under bootstrap. Jeg havde ingen erfaring med at skubbe rundt med ZFs frontcontroller, men efter at have gravet lidt i dokumenterne kom jeg op med denne løsning, som har nøjagtig samme effekt som den fulde ErrorDocument direktiv havde jeg ønsket at rejse.

$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); 

Formentlig har du i dine htaccess-regler også en omskrivningsregel til at dirigere alle anmodninger til Zend Framework. På dette tidspunkt er Apache (og ErrorDocument) ikke rigtig på billedet, som du har fortalt det, at du ønsker, at anmodningerne skal håndteres af PHP.

Når du gør det:

http_response_code(404); exit(0); 

du sender en tom 404-side til browseren. Mange browsere er indstillet til at vise deres egen brugervenlige 404-side, hvis størrelsen på den 404-side, de modtager fra serveren, er mindre end X bytes. (Bare for en bedre brugeroplevelse.)

Zend Framework skal fange dette og bruge sin egen fejlside afhængigt af hvor du sætter den PHP-kode (og muligvis baseret på nogle konfigurationsindstillinger).

Jeg vil foreslå, at du opdaterer Zend Framework ErrorController-siden, så den ser ud, som du vil. Jeg tror ikke, der er en måde at håndtere behandlingen af ​​anmodningen tilbage til Apache (som det var).

arbejdet for dig: Charles Robertson | Ønsker du at kontakte os?