PHP'de nasıl 404 hatası oluşturabilirim?


111

Benim .htaccess tüm istekleri yönlendirir /word_hereiçin /page.php?name=word_here. PHP betiği daha sonra istenen sayfanın kendi sayfa dizisinde olup olmadığını kontrol eder.

Değilse, 404 hatasını nasıl simüle edebilirim? Bunu denedim, ama üzerinden yapılandırılır benim 404 sayfa yol açmamıştır ErrorDocumentiçinde .htaccessgösterilmesini.

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

404 hata sayfama yönlendirmenin yanlış olduğunu düşünmekte haklı mıyım?


Neden işe yaramayacağını söylüyorsun? Sunucu yanıt başlığını kontrol ettiniz mi?
Gumbo 04

1
Son sorunuza yanıt olarak, evet, tüm 404'leri gerçek bir sayfaya yönlendirmek kötü bir fikir olur. Bu, olmaması gereken bir şeyi orada olan bir şeye dönüştürerek HTTP spesifikasyonunu ihlal eder.
Lucas Oman

Yanıtlar:


157

404 sayfa oluşturmanın güncel yanıtı (PHP 5.4 veya daha yeni) şu şekildedir http_response_code:

<?php
http_response_code(404);
include('my_404.php'); // provide your own HTML for the error page
die();

die() kesinlikle gerekli değildir, ancak normal uygulamaya devam etmemenizi sağlar.


bunu hangi dosyaya eklemeliyim?
Julfikar

87

Yaptığınız şey işe yarayacak ve tarayıcı bir 404 kodu alacak. Yapmayacağı şey , beklediğiniz "bulunamadı" sayfasını görüntülemektir, örneğin:

Bulunamadı

İstenen URL /test.php bu sunucuda bulunamadı.

Bunun nedeni, web sunucusunun PHP bir 404 kodu döndürdüğünde bu sayfayı göndermemesidir (en azından Apache bunu yapmaz). PHP kendi çıktısının tümünü göndermekten sorumludur. Dolayısıyla, benzer bir sayfa istiyorsanız, HTML'yi kendiniz göndermeniz gerekir, örneğin:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>

Apache'yi kendi 404 mesajları için aynı sayfayı kullanacak şekilde yapılandırabilirsiniz, bunu httpd.conf içine koyabilirsiniz:

ErrorDocument 404 /notFound.php

Teşekkürler. 404 sayfamı kullandığını varsaymıştım.
Eric

@JW Yukarıdaki kod nerede kullanılacak? bu '.htaccess' dosyasının kodudur.
Manohar Kumar

@ManoharKumar yukarıdaki kodu 404 sayfasını göndermek istediğiniz yerde kullanın. Benim durumumda, biri koduyla bir öğeyi aradığında, ancak var olmadığında kullandım. Bu nedenle, öğenin mevcut olmadığını öğrendikten sonra yukarıdaki kodu kullanıyorum ve 404 sayfasından sonra herhangi bir şey yüklemekten kaçınmak için bu kodun 3. satırında da çıkış kullandım. teşekkür ederim JW, benim için çok çalıştı.
Harsha

22

Bunu dene:

<?php
header("HTTP/1.0 404 Not Found");
?>

3
Bir 404, hem HTTP 1.0 hem de 1.1'de bir 404'tür. 1.0 güvenli bir bahistir. Serin şaka BTW :) +1
Ates Goral

benim durumumda başlık vermem gerekiyor ("Konum: HTTP / 1.0 404 Bulunamadı");
EasyLearn Akademi

9

.Htaccess dosyası aracılığıyla özel hata sayfaları oluşturun

1. 404 - sayfa bulunamadı

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Dahili Sunucu Hatası

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Yasak

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Hatalı istek

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Yetkilendirme Gerekli

RewriteEngine On
ErrorDocument 401 /401.html

Ayrıca tüm hatayı tek bir sayfaya yönlendirebilirsiniz. sevmek

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html

RewriteEngine'in bununla hiçbir ilgisi yoktur; bu satır aynı sonucu elde etmek için güvenli bir şekilde ihmal edilebilir.
WoodrowShigeru

3

Başlığı gönderdikten sonra ölmeyi () hatırladınız mı? 404 başlığı işlemeyi otomatik olarak durdurmaz, bu nedenle daha fazla işlem varsa hiçbir şey yapmamış gibi görünebilir.

404 sayfanıza YÖNLENDİRMEK iyi değildir, ancak içeriği sorunsuz bir şekilde dahil edebilirsiniz. Bu şekilde, doğru URL'den 404 durumunu doğru bir şekilde gönderen bir sayfanız olur, ancak aynı zamanda "ne arıyorsunuz?" insan okuyucu için sayfa.


0

koymayı dene

ErrorDocument 404 /(root directory)/(error file) 

içinde .htaccessdosyaya.

Bunu herhangi bir hata için yapın, ancak kendi hatanız için 404'ü değiştirin.


0

Drupal veya Wordpress CMS'de (ve muhtemelen diğerleri), bazı özel php kodlarının varolmadığını göstermeye çalışıyorsanız (bazı koşullar karşılanmadıkça), aşağıdakiler CMS'nin 404 işleyicisini devralarak iyi çalışır:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>

-2

Bu satırdan hemen sonra exitveya kullanarak yanıtı kapatmayı deneyin.die()

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
exit;

veya

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();

1
Bunu yaparsanız, kullanıcı boş bir sayfa görür. Sorum, belirttiğim aynı 404 sayfasının ErrorDocumentPHP'den nasıl gönderileceğiydi.
Eric

ErrorDocument kullanmak istiyorsanız, özel hata dosyanızın yolunun sunucu örneğinin köküne göre olduğundan emin olun: sanal yolunuzun sunucunun kökünden / klasör1 / klasör2 / myhtaccess olduğunu söyleyin, hata belgeniz böyle bir şeye benzeyecektir ErrorDocument 404 /folder1/folder2/my404.html
user5891645

ErrorDocumentPHP kodunu zaten girdikten sonra herhangi bir etkisi olmaz. bu cevap 9 yıl önce
Eric

Umarım sorunun şimdiye kadar çözülmüştür. Kapalı bir konuda,? Name = word_here ile yeniden yönlendirmemeniz daha iyi olur. Bunun yerine $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");page.php dosyanızda kullanın . Çünkü bu sayfalardan birinin kullanıcıdan bir sorgu "adı" beklediği bir senaryo var.
user5891645

-2

bunu bir kez dene.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.