Soru Mod_rewrite ile Apache yerleşik 404 sayfasına yönlendirin?


Apache'nin aktif olarak hizmet etmesinin bir yolu var mı varsayılan, dahili 404 sayfası mod_rewrite kullanan birkaç URL için? Özel bir hata belgesi değil, bir kural gibi

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule -- serve 404 page -----

404 üstbilgisini gönderen bir PHP sayfasının nasıl oluşturulacağını biliyorum. mod_rewrite Buradaki tüm URL'leri yönlendirin ancak temel aldığım bir çözümü tercih ederim. mod_rewrite bir tek.

Sadece var olmayan bir adrese yönlendirme fikri vardı:

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf

ama bu kullanıcıya mesaj verirdi "/ sflkadsölfkasdfölkasdflökasdf mevcut değil" biraz profesyonel olmayan hata sayfasında.


25
2018-03-15 12:42


Menşei


Kapatmak için seçmen: mod_rewrite soruları resmen SO için doğru. meta.stackexchange.com/questions/39063/... - Pekka 웃


Cevaplar:


Kullanabilirsiniz R bayrağı RewriteRule belirli bir durum koduyla yönlendirmeyi zorlamak için:

Bu genellikle yönlendirmeler için kullanılırken, geçerli herhangi bir durum kodu burada verilebilir. Durum kodu yeniden yönlendirme aralığının dışındaysa (300-399), Yerine getirme dizgisi bırakılır ve L bayrağı kullanılmış gibi yeniden yazdırılır.

Yani bu:

RewriteRule ^/?page\.html$ - [R=404]

varsayılan 404 sayfasını döndürür /page.html. Bu bir regexp olduğundan, kaçmayı hatırla \. ve demirleme $.

- yoksayılır (yani "İkame dizisi atılır"), ancak kuralın iyi biçimlendirilmiş halde kalması için hala bir şey olması gerekir.


39
2018-03-15 13:19



Mmm, varsayılan hata sayfasını tetikleyeceğinden emin değil miydi? Çünkü biraz değer vermek zorundayım whatever ve o orada olmaz mıydı? Yine de yanlış olabilir, deneyeceğim ve rapor edeceğim. - Pekka 웃
Hayır, alıntı söylendiği gibi, İkame dizgisini (örneğin, örneğimde "ne olursa olsun") yok sayar. - mercator
@mercator Elbette. Üzgünüm, bunu okumadım. - Pekka 웃
@Pekka, sorun değil :) - mercator
Önde gelen bir "/" nin varlığı ya da yokluğu, yeniden yazma kuralının genel yapılandırmada (var olduğu yerde) ya da bir .htaccess'in (buradaki dosya adı-URL eşlemesi). kullanım /? Her iki bağlamda da çalışacak bir alttabaka için. - outis


Bunu yapmanın en iyi yolu R, 404 durum koduyla bayrak:

RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]

Ancak bu sadece Apache 2'den beri kullanılabilir.


10
2018-03-15 16:43



ya da netlik için, onu [yönlendirme = 404] şeklinde yazınız. - Mark Stosberg
Genellikle, NC başka iyi bir maddedir. RewriteEngine potansiyel olarak kapalı olabiliyorsa, Normalden filesmatch-All'dan Forbid'in daha güvenli olabileceğini unutmayın. - Frank Nocke


bunu onaylıyorum

RewriteRule ^ - [L,R=404]

veya

RewriteRule ^ - [L,redirect=404]

işe yaramayacak. Resmi Apache web sitesinden açıklama şöyle:

Ancak, bir durum kodu yönlendirme aralığının dışındaysa (300-399)   ikame dizisi tamamen düştü ve yeniden yazma durduruldu   L kullanılmıştı.

En iyi çözüm, daha sonra açıklandığı gibi 404 başlıklı bir 404.php dosyasına yönlendirmektir.


4
2018-01-07 14:13





Bu çalışmalı:

RewriteEngine on
RewriteRule ^/page.html /error404.html [L]

Bu olsa 404 üstbilgisi vermeyecek. İşaretlenmeyi değiştirmeyi deneyebilirsiniz [L,R=404] ama bunun işe yaramayacağından şüpheliyim (sadece yönlendirmeler için olması gerekiyordu).

PHP'de bunu yapma fikriniz işe yarayacaktı. Tüm "hata sayfalarınız" sayfalarınız sunucu tarafı ise (yani PHP), bu kodu kullanabilirsiniz:

<?php
header( 'HTTP/1.0 404 Not Found' );
include 'error404.html';

1
2018-03-15 13:08



Evet, muhtemelen bununla sonuçlanacağım. Apache'nin yerleşik hata sayfasını (bir tane oluşturmak zorunda kalmadan) tetiklemenin bir yolu olup olmadığını merak ediyorum. Yeniden yazma kuralı gibi bir şey "bu URL eşleştiğinde dahili 404 işlemeyi tetikler." - Pekka 웃