2011-05-10 13 views
14

Bir veritabanında bir sayfanın olup olmadığını bulmak için URI işlemek zorunda olan bir web sunucum var.Apache'nin PHP'deki varsayılan 404 sayfasını görüntüleme

Options +FollowSymlinks 
RewriteEngine on 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?p=$1 [NC] 

Sorunum sayfa yoksa, ben PHP ile yazılmış özel bir 404 işleyicisi kullanmak istemiyorum yani, yapmam istiyorum: Ben .htaccess ile app URI yönlendiren bir sorunum yok varsayılan Apache 404 sayfasını göster. PHP'nin, sayfanın bulunmadığını belirlediğinde Apache'ye geri vermesini sağlayan bir yol var mı?

+0

Gerçekten değil. 404 sayfasına 'header (' Location: ... ') 'aracılığıyla basit bir yönlendirme yapabilirdiniz, ancak bu, zayıf uygulama olarak kabul edilen' 200 OK 'talebi olarak gösterilir. –

+1

bu size yardımcı olabilir: http://stackoverflow.com/questions/4232385/php-or-htaccess-make-dynamic-url-page-to-go-404-when-item-is-missing-in-db –

+0

Bunun için hala kolay bir seçenek olmadığını düşünüyorum, http://stackoverflow.com/q/4856425/345031 – mario

cevap

5

Yukarıdaki senaryo içinde php kodu bu tip sahip olmaktır için farkındayım tek olası yolu senin index.php:

<?php 
if (pageNotInDatabase) { 
    header('Location: ' . $_SERVER["REQUEST_URI"] . '?notFound=1'); 
    exit; 
} 

Ve sonra hafifçe bu gibi .htacces değiştirin:

Options +FollowSymlinks -MultiViews 
RewriteEngine on 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !notFound=1 [NC] 
RewriteRule ^(.*)$ index.php?p=$1 [NC,L,QSA] 

Bu şekilde Apache, bu özel durum için php kodundan eklenmiş negatif sorgu parametresi ve ekli ?notFound=1 numaralı sorgu parametresi nedeniyle varsayılan 404 sayfasını gösterecektir. Aynı .htaccess sayfası için bir sonraki sefer index.php'ye yönlendirilmeyecektir.

PS: /foo gibi bir URI veritabanında bulunamadı eğer tarayıcıda /foo?notFound=1 haline gelecektir.

+0

Bunu 404 işleyicisinden çağırırsanız, bu döngüler. – Mel

+0

'başlığı ('Yer:/var olmayan-sayfa-url');' özel 404 işleyicinizden olması gerekiyordu. Cevabımı görün, yukarıda index.php yazdım. Aslında Apache'nin 404 işleyicisini göstermek istiyorsanız, özel bir 404 işleyiciniz olmamalıdır. Önkoşul yapılandırmanızda 'ErrorDocument 404 'veya ilk olarak .htaccess'in yorumlanmasını öneririm. – anubhava

+0

Ah benim kötü. Orijinal soruyu yanlış. – Mel

4

Çağrı bu işlevi: Ben Apache için "geri teslim" sanmıyorum, ama böyle 404 dosyayı uygun HTTP başlığı göndermek ve daha sonra açıkça içerebilir

http_send_status(404); 
+9

Bu, – andrewtweber

+2

İyi gözlem kurulumunu yapamayacağı pecl_http paketini gerektirir. –

+2

iyi gözlem –

14

:

if (! $exists) { 
    header("HTTP/1.0 404 Not Found"); 
    include_once("404.php"); 
    exit; 
} 

Güncelleme

PHP 5.4 hatır için bu biraz daha kolay hale getirir http_response_code fonksiyonunu tanıtıldı ber.

if (! $exists) { 
    http_response_code(404); 
    include_once("404.php"); 
    exit; 
} 
İlgili konular