.Htaccess RewriteRule çalışmıyor hata ayıklama


115

Bir var RewriteRulebir de .htaccesshiçbir şey yapmıyor dosyası. Bunu nasıl giderebilirim?

  • .htaccessDosyanın Apache tarafından okunup ona itaat edildiğini nasıl doğrulayabilirim ? Bir yankı "çalışıyor" mesajı yazabilir miyim, yazarsam bu satır nerede yankılanır?
  • Eğer .htaccessdosya kullanılmayan, nasıl Apache kullanmak yapabilir?
  • Eğer .htaccesskullanılıyorsa ancak benim RewriteRulehala bir etkisi yoksa, hata ayıklamak için daha ne yapabilirim?

Yanıtlar:


144

.htaccess Örneğin foo bar, sakjnaskljdnas htaccess tarafından tanınmayan herhangi bir anahtar kelimenize bir miktar önemsiz değer girin ve URL'nizi ziyaret edin. Çalışıyorsa, bir almalısınız

500 Dahili Sunucu Hatası

İç Sunucu Hatası

Sunucu dahili bir hata veya yanlış yapılandırma ile karşılaştı ve isteğinizi tamamlayamadı ...

Hemen sonra koymanızı öneririm RewriteEngine on.


Makinenizde olduğunuz için. Apache .confdosyasına erişiminiz olduğunu varsayıyorum .

.confdosyayı açın ve şuna benzer bir satır arayın:

LoadModule rewrite_module modules/mod_rewrite.so

Yorumlanmışsa (#), açıklamayı kaldırın ve apache'yi yeniden başlatın.


Yeniden yazmayı kaydetmek için

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Yukarıdaki 3 satırı virtualhost. httpd'yi yeniden başlatın.

RewriteLogLevel 9Seviye için yüksek bir değer kullanmak Apache sunucunuzu önemli ölçüde yavaşlatacaktır! Yeniden yazma günlük dosyasını 2'den büyük bir Düzeyde yalnızca hata ayıklama için kullanın! Seviye 9, hemen hemen her yeniden yazma kaydı detayını kaydeder.


GÜNCELLEME

Apache 2.4'te işler değişti:

FROM 2.2'den 2.4'e yükseltme

RewriteLog ve RewriteLogLevel direktifleri kaldırıldı. Bu işlevsellik artık LogLevel yönergesi kullanılarak mod_rewrite modülü için uygun günlük kaydı düzeyini yapılandırarak sağlanmaktadır . Mod_rewrite günlük kaydı bölümüne de bakın.

LogLevel hakkında daha fazla bilgi için LogLevel Direktifine bakın

başarabilirsin

RewriteLog "/path/to/rewrite.log"

şimdi bu şekilde

LogLevel debug rewrite_module:debug

Tamam, sorun şu ki, .htaccess dosyasına bir yeniden yazma terimi eklemeye çalışıyorum ve bir nedenle onu kullanmıyor.
macha

@macha yukarıdaki yöntemi deneyin. Dahili bir sunucu hatası alırsanız, bu mod_rewrite (.htaccess) etkin demektir. Paylaşılan bir ev sahibi misiniz?
ThinkingMonkey

Hayır, localhost'um üzerinde çalışıyorum, .htaccess dosyasının ne zaman yükleneceği hakkında bir fikriniz var mı? Sanırım apache bunu ilk olarak okuyacaktı
macha

@macha .htaccess dosyaları asla yüklenmez. Bu klasörde bulunan bir sayfaya erişmeye çalıştığınızda (varsa) bunlara apache tarafından erişilir.
ThinkingMonkey

tamam sorum şuydu, birisi bir web sayfası isterse, apache doğrudan sunucu tarafındaki komut dosyalarına gider mi yoksa o klasörde .htaccess dosyasını arar ve sonra devam eder mi?
macha

52

'Bir miktar önemsiz değer girin' cevabı benim için işe yaramadı, sitem girilen önemsizlere rağmen yüklenmeye devam ediyordu.

Bunun yerine .htaccess dosyasının en üstüne aşağıdaki satırı ekledim:

deny from all

Bu, .htaccess'in alınıp alınmadığını hızlı bir şekilde size bildirecektir. .Htaccess kullanılıyorsa, bu klasördeki dosyalar hiç yüklenmez.


4
Doğrulama yaparken birkaç saniye hiçbir şeyin çalışmamasına aldırmazsanız, bu en basit testtir.
Mordred

1
Evet - üzerinde çalıştığım sitenin .htaccess dosyalarını kullanmadığını doğrulamam yaklaşık bir saniyemi aldı.
bonh

1
Teşekkürler, bir cazibe gibi çalışıyor :) hata ayıklamada biraz zaman kazandırdı!
Martijn van Hoof

32

Genellikle .htaccess'teki herhangi bir değişikliğin görünür etkileri olmalıdır. Etki yoksa, yapılandırma apache dosyalarınızı kontrol edin, örneğin:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Olarak değiştirilmelidir

AllowOverride All

Ve .htaccess dosyalarındaki yönergeleri değiştirebileceksiniz.


Teşekkürler. Ana apache2.conf dosyasında / var / www dizini için ilgili bölümü buldum
Tim Richardson

6

Belki daha mantıklı bir yöntem, bir dosya oluşturmak (örn. Test.html), biraz içerik eklemek ve ardından bunu dizin sayfası olarak ayarlamaya çalışmak olabilir:

DirectoryIndex test.html

Çoğunlukla, .htaccess kuralı, dizin / dosya düzeyinde çalışırken Apache yapılandırmasını geçersiz kılacaktır.


4

Üç sorudan ilk soruyu yanıtlamak için, .htaccess dosyasının çalışıp çalışmadığını görmenin basit bir yolu .htaccess dosyasının en üstünde özel bir hatayı tetiklemektir:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

İkinci sorunuza gelince, .htaccess dosyası okunmuyorsa, sunucunun ana Apache yapılandırmasının olarak AllowOverrideayarlanmış olması mümkündür None. Apache'nin belgelerinde bu ve .htaccess'in etkili olmasını engelleyebilecek diğer durumlar için sorun giderme ipuçları bulunur .

Son olarak, üçüncü sorunuza cevap vermek için , yeniden yazma kuralınızda başvurduğunuz belirli değişkenlerde hata ayıklamanız gerekiyorsa veya kuraldan bağımsız olarak değerlendirmek istediğiniz bir ifade kullanıyorsanız , aşağıdakileri yapabilirsiniz:

Beklediğiniz değere sahip olduğundan emin olmak için başvurduğunuz değişkenin çıktısını alın:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

İfadeyi bir <If>Direktife koyarak bağımsız olarak test edin . Bu, ifadenizin doğru yazıldığından veya beklediğinizde eşleştiğinden emin olmanızı sağlar:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

Mutlu .htaccess hata ayıklamaları!


3

Apache bin dizinine erişiminiz varsa,

httpd -M önce yüklü modülleri kontrol etmek için.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

Bu kadar basit direktifleri sonra benzeri Options -Indexesveya deny from all.htaccess doğru çalıştığını pekiştireceğiz.


1

Htaccess yeniden yazma kurallarınızı test etmek için, kuralları uyguladığınız url'yi doldurmanız, htaccess'inizin içeriğini daha büyük giriş alanına yerleştirmeniz ve "Test" düğmesine basmanız yeterlidir.

http://htaccess.mwl.be/


-1

Neden .htaccess dosyanıza biraz önemsiz koyup apache'yi yeniden yüklemeyi denemiyorsunuz? Apache başlamazsa, çalıştığını bilirsiniz. Gereksiz dosyayı kaldırın ve .htaccess'i doğru yapılandırdığınız tebrikleri yüklerse apache'yi yeniden yükleyin.


7
Bir sayfa isteği olana kadar .htaccess'i kontrol etmediği için, kötü bir .htaccess varsa Apache'nin başlatılamayacağını veya çalışmayacağını sanmıyorum.
Andrew
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.