Hata ayıklama ipuçları .htaccess yeniden yazma kuralları


272

Birçok poster, .htaccessdosyalarındaki RewriteRule ve RewriteCond ifadelerinde hata ayıklamada sorun yaşar . Bunların çoğu paylaşılan bir barındırma hizmeti kullanıyor ve bu nedenle kök sunucu yapılandırmasına erişimi yok. Onlar ortadan kaldıramıyorsanız .htaccessyeniden yazma için dosyaları ve olamaz birçok katılımcı önerdiği gibi bir RewriteLogLevel" etkinleştirin. Ayrıca çok var .htaccessya spesifik tuzaklar ve kısıtlamaları iyi kapsamında değildir edilmektedir. Ayarlama yerel testi LAMBA yığın çoğu için çok fazla bir öğrenme eğrisi gerektirir .

Buradaki Q'm , kurallarının kendilerinde hata ayıklamalarını nasıl önerebiliriz . Aşağıda birkaç öneri sunuyorum. Diğer öneriler takdir edilecektir.

  1. Mod_rewrite motorunun .htaccessdosyalar arasında dolaştığını anlayın . Motor şu döngüyü çalıştırır:

    do
      execute server and vhost rewrites (in the Apache Virtual Host Config)
      find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled
      if found(.htaccess)
         execute .htaccess rewrites (in the user's directory)
    while rewrite occurred
    

    Böylece kurallarınız tekrar tekrar yürütülür ve URI yolunu değiştirirseniz, .htaccessvarsa diğer dosyaları da yürütür. Bu nedenle, gerektiğinde RewriteCondkuralların tetiklenmesini durdurmak için fazladan ekleyerek bu döngüyü sonlandırdığınızdan emin olun . Ayrıca .htaccess, açıkça çok düzeyli kural kümelerini kullanmak istemedikçe, daha düşük düzeyli yeniden yazma kural kümelerini de silin .

  2. Geçerli bir sözdizimi olduğundan ve tam olarak bir dizi test URI'si ile ne yapmak istediğinizi yaptığından emin olmak için bir dizi test deseni ile test yaparak her Regexp'nin sözdiziminin doğru olduğundan emin olun. Daha fazla ayrıntı için aşağıdaki cevaba bakınız .

  3. Kurallarınızı adım adım bir test dizininde oluşturun. .htaccessAna kurallarınızı bozmadan ve sitenizin çalışmasını durdurmadan ayrı bir test dizini (ağaç) oluşturmak ve kural ayıklama kurallarını ayarlamak için "yoldaki en derin dosyayı yürüt" özelliğini kullanabilirsiniz. Bunları tek tek eklemeniz gerekir, çünkü hataları tek tek kurallara göre yerelleştirmenin tek yolu budur.

  4. Sunucu ve ortam değişkenlerini boşaltmak için sahte bir komut dosyası kullanın . (Bkz. Liste 2 ) Uygulamanız varsa diyelim, blog/index.phpbunu kopyalayabilir test/blog/index.phpve testalt dizindeki blog kurallarınızı test etmek için kullanabilirsiniz . Yeniden yazma motorunun, ikame dizelerini doğru şekilde yorumlarken ortam değişkenlerini de kullanabilirsiniz;

    RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
    

    ve phpinfo dökümünde bu REDIRECT_ * değişkenlerini arayın . BTW, bunu kullandım ve sitemde kullanmam gerektiğini keşfettim %{ENV:DOCUMENT_ROOT_REAL}. Yeniden yönlendirici döngüsünde REDIRECT_REDIRECT_ * değişkenleri önceki geçişi listeler. Vb..

  5. Yanlış 301 yönlendirmelerini önbelleğe alarak tarayıcınız tarafından ısırılmadığınızdan emin olun . Aşağıdaki cevaba bakınız . Bunun için Ulrich Palha'ya teşekkür ederim .

  6. Yeniden yazma motoru .htaccess, bir bağlam içindeki basamaklı kurallara karşı hassas görünüyor (bu, RewriteRulebir ikame ile sonuçlanır ve bu da başka kurallara düşüyor), çünkü dahili alt istekleri olan hatalar bulduğumdan (1) ve sıklıkla ortaya çıkabilecek yanlış PATH_INFO işleme [NS], [L] ve [PT] bayraklarının kullanılmasını önler.

Başka yorum veya öneriniz var mı?

Liste 1 - phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);

10
Bunlar iyi ... Belki de onları sorudan bir cevaba taşımalısınız.
w00t

@ w00t, regexp denetleyicisini önerilerinize göre ayırdım çünkü diğer yanıtlardaki bağlantıya başvurmak istiyorum.
TerryE

3
Dokümanlardaki kontrol akış şemasını ilk önerinize eklemek isteyebilirsiniz . IMO, herhangi bir sahte kod veya açıklamadan daha kolay anlaşılır ve bu gerçekten mod-yeniden yazma voodoo'sunun en siyah kısmıdır.
Ağustos'ta

6 numara büyük bir anlaşma. Standart apache yapılandırma dosyalarında veya .htaccess dosyalarında farklı davranan kuralları yeniden yazmanın birçok kişiyi yakalaması gerekir.
Iain Collins

Bu ipuçlarına eklemeye değer bir şey olabilir: Yeniden yönlendirme ve yeniden yazma ile ilgili bir sorunu çözmek için biraz zaman harcadım. "/ Comment /" istediğim zaman "/ comment" için yeniden yazma vardı çıkıyor. "/ Comment" olarak yeniden yazılıyor ve sonra sunucu "/ comment /" dizinine yönlendirme yapıyordu. Apache'ye alışkın olanlara bariz davranışlar ama muhtemelen benim gibi yeni başlayanlar için daha az.
Chris

Yanıtlar:


132

Paylaşılan barındırmadaki kullanıcılar için hata ayıklamayı kolaylaştırabilecek test kurallarına ilişkin birkaç ek ipucu aşağıda verilmiştir

1. Sahte kullanıcı aracısı kullanın

Yeni bir kuralı test ederken, kuralı yalnızca fakeistekleriniz için kullanacağınız bir kullanıcı aracısıyla yürütmek için bir koşul ekleyin . Bu şekilde sitenizdeki hiç kimseyi etkilemez.

Örneğin

#protect with a fake user agent
RewriteCond %{HTTP_USER_AGENT}  ^my-fake-user-agent$
#Here is the actual rule I am testing
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
RewriteRule ^ http://www.domain.com%{REQUEST_URI} [L,R=302] 

Firefox kullanıyorsanız , sahte kullanıcı aracısı dizesini oluşturmak ve test etmek için Kullanıcı Aracısı Anahtarlayıcısını kullanabilirsiniz.

2. Test bitene kadar 301 kullanmayın

İnsanların hala kurallarını test ettikleri ve 301'leri kullandıkları birçok gönderi gördüm. YAPMAYIN .

Sitenizde öneri 1'i kullanmıyorsanız, yalnızca siz değil, aynı zamanda sitenizi ziyaret eden herkes 301'den etkilenecektir.

Bunların kalıcı olduğunu ve tarayıcınız tarafından agresif bir şekilde önbelleğe alındığını unutmayın. Emin oluncaya kadar 302 kullanın, ardından 301 olarak değiştirin.

3. 301'lerin tarayıcınızda agresif bir şekilde önbelleğe alındığını unutmayın

Kuralınız işe yaramazsa ve size doğru görünüyorsa ve öneri 1 ve 2'yi kullanmıyorsanız, tarayıcı önbelleğinizi temizledikten sonra veya özel tarama sırasında yeniden test edin.

4. Bir HTTP Yakalama aracı kullanın

Tarayıcınız ve sunucu arasındaki gerçek HTTP trafiğini görmek için Fiddler gibi bir HTTP yakalama aracı kullanın .

Diğerleri bunu söylese de , sorunu hızlı bir şekilde daraltarak site does not look right, bunu görebilir ve raporlayabilirsiniz all of the images, css and js are returning 404 errors.

Diğerleri sizi rapor ederken started at URL A and ended at URL C, onların başladığını görebileceksiniz URL A, were 302 redirected to URL B and 301 redirected to URL C. URL C nihai hedef olsa bile, bunun SEO için kötü olduğunu ve düzeltilmesi gerektiğini bileceksiniz.

Sunucu tarafında ayarlanan önbellek başlıklarını görebilir, istekleri tekrarlayabilir, test etmek için istek başlıklarını değiştirebilirsiniz.



9
Ulrich, bu girdi için çok teşekkürler. Listeme koymayı düşünmediğim bazı yönleri seçtin. 301 hata ayıklama sorunu, pencereyi kapattığınızda bu durum bilgilerini dökümü olarak Chrome'u "Özel Tarama" (AKA "Porno modu") kullanıyorum. Umarım bunu önemli bir nokta olarak kabul etmemenin bir sakıncası yoktur, ama en iyi tek cevap değildir. Tekrar teşekkürler. :)
TerryE

1
[L,R=302]
Netleştirmek

6
Açık olarak varsayılanı belirtmeniz [L, R=302]gerekmez[L,R]302
Rahil Wazir

2
@goodeye, ayrıca "Chrome> Ayarlar> Genel> DevTools açıkken Önbelleği Devre Dışı Bırak" onay kutusuna da bakın.
johnsnails

83

Çevrimiçi .htaccess yeniden yazma testi

RegEx için bu Googling yardımını buldum , .htaccessher küçük değişiklik yaptığımda yeni dosyalar yüklemek zorunda kalmamdan çok zaman kazandım.

siteden:

htaccess test cihazı

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 "Şimdi Kontrol Et" düğmesine basmanız yeterlidir.


6
Sorunumu ayıklamak için en doğrudan yolu bulduğum bu araca işaretçi için teşekkürler.
BobHy

Web alanınıza ssh erişiminiz varsa, başka bir seçenek .htaccess'i doğrudan sunucudaki düzenleyici aracılığıyla değiştirmektir.
sjas

Site sertifikasında sorun yaşadığı ssl uyarısını yok saymanız gerekir. Ama site hala orada. Bu en iyi ve en kolay çözümdür. Neyin yanlış olduğuna dair inanılmaz bir fikir verir ve sorunu HIZLI düzeltmeye neden olur.
toddmo

Bu aracı işaret ettiğiniz için teşekkür ederiz. Yararlı, Bazen apache htaccess hata ayıklama sooo lanet zor. Teşekkürler. Büyük Teşekkürler
Benyamin Limanto

Referans verilen bağlantı buggy ve her zaman size kesin çıktı vermedi gibi görünüyor. Kesinlikle emin olmak için lütfen gerçek apache'yi kontrol edin.
Parth

13

.Htaccess dosyalarında eşleşen göreli bir URL olduğunu unutmayın.

Bir .htaccess dosyasında aşağıdaki RewriteRule hiçbir zaman eşleşmeyecektir:

RewriteRule ^/(.*)     /something/$s

4
Evet, bir Yeniden Yazma Kuralı'na beslenen dize görecelidir ve bu nedenle herhangi bir satırda soyulur /, ancak bu sıyırma, Yeniden Yazma Cond komutlarında toplanan eşleme dizeleri için gerçekleşmez .
TerryE

8

Her Regexp'in sözdiziminin doğru olduğundan emin olun

geçerli bir sözdizimi olduğundan ve tam olarak bir dizi test URI'siyle ne yapmak istediğinizi yaptığından emin olmak için bir dizi test desenine göre test ederek.

Bkz regexpCheck.php Bunu yapmak yardımına sitenize özel / test dizinine ekleyebileceğiniz basit bir komut dosyası için aşağıda. Güzel değil de bu özeti sakladım. Bunu regexpCheck.phpweb sitenizde kullanmak için bir test dizinindeki bir dosyaya geçmeniz yeterlidir. Bu, herhangi bir normal ifadeyi oluşturmanıza ve bunu yaptığınız gibi bir test senaryosu listesine karşı test etmenize yardımcı olacaktır. Burada PHP PCRE motorunu kullanıyorum, ancak Apache kaynağına bir göz attığımda, bu temelde Apache'de kullanılanla aynı. Şablonlar sağlayan ve regexp becerilerinizi geliştirmenize yardımcı olabilecek birçok HowTos ve öğretici vardır.

Liste 1 - regexpCheck.php

<html><head><title>Regexp checker</title></head><body>
<?php 
    $a_pattern= isset($_POST['pattern']) ? $_POST['pattern'] : "";
    $a_ntests = isset($_POST['ntests']) ? $_POST['ntests'] : 1;
    $a_test   = isset($_POST['test']) ? $_POST['test'] : array();
    
    $res = array(); $maxM=-1; 
    foreach($a_test as $t ){
        $rtn = @preg_match('#'.$a_pattern.'#',$t,$m);
        if($rtn == 1){
            $maxM=max($maxM,count($m));
            $res[]=array_merge( array('matched'),  $m );
        } else {
            $res[]=array(($rtn === FALSE ? 'invalid' : 'non-matched'));
        }
    } 
?> <p>&nbsp; </p>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'];?>">
    <label for="pl">Regexp Pattern: </label>
    <input id="p" name="pattern" size="50" value="<?php echo htmlentities($a_pattern,ENT_QUOTES,"UTF-8");;?>" />
    <label for="n">&nbsp; &nbsp; Number of test vectors: </label>
    <input id="n" name="ntests"  size="3" value="<?php echo $a_ntests;?>"/>
    <input type="submit" name="go" value="OK"/><hr/><p>&nbsp;</p>
    <table><thead><tr><td><b>Test Vector</b></td><td>&nbsp; &nbsp; <b>Result</b></td>
<?php 
    for ( $i=0; $i<$maxM; $i++ ) echo "<td>&nbsp; &nbsp; <b>\$$i</b></td>";
    echo "</tr><tbody>\n";
    for( $i=0; $i<$a_ntests; $i++ ){
        echo '<tr><td>&nbsp;<input name="test[]" value="', 
            htmlentities($a_test[$i], ENT_QUOTES,"UTF-8"),'" /></td>';
        foreach ($res[$i] as $v) { echo '<td>&nbsp; &nbsp; ',htmlentities($v, ENT_QUOTES,"UTF-8"),'&nbsp; &nbsp; </td>';}
        echo "</tr>\n";
    }
?> </table></form></body></html>

1
Hızlı not: import_request_variables PHP 5.3'te kullanımdan kaldırıldı ve 5.4'te kaldırıldı. extract($_GET)ile birleştiğinde extract($_POST)aynı işlevi yerine getirebilir, ancak tüm değişkenlerin isimlerinden önek kaldırılması gerekir. Kaynak: php.net/manual/tr/function.import-request-variables.php
Jeff Lambert

@ watcher, teşekkürler. Yerel sürümümü bir yıl önce 5.4 uyumlu olacak şekilde güncelledim, ancak bu yayını değiştirmeyi unuttum. Şimdi bitti.
TerryE

oh benim, düzenleme sonra bile, sadece kodunuzu kopyalayarak iyi sonuçlar elde edemezsiniz ... ama regex kemancılar ile, ben araç her nasılsa eski olduğunu düşünüyorum. şu harika araçlara göz atın: göz atın regex101.com veya refiddle.com veya regexr.com
hexerei yazılımı 31:15

@hexereisoftware, bu yazı 3 yaşında, bu yüzden şimdi kullanılan PHP sürümüne ve Apache sürümüne bağlı olarak küçük sorunlar olabilir. Bununla birlikte, her biri ince farklılıklara sahip birçok regexp varyantı vardır. Dediğim gibi Apache kodu PHP motoruna çok benzeyen bir PCRE motoru kullanıyor. Net gibi diğer varyantları ile farklarının ne olduğundan emin değilim, bu yüzden çevrimiçi bir kaynak kullanma öneriniz iyi olsa da, açıkça apache veya PHP sözdizimini destekleyen biriyle yapışırdım. :-)
TerryE

Perl en yakın olur, ancak php aynı sözdizimini kullanır
hexerei yazılımı

7

Dolar işareti yerine değişkenlerin önünde yüzde işaretini kullandığınızdan emin olun.

O var %{HTTP_HOST}, değil ${HTTP_HOST} . Error_log içinde hiçbir şey olmayacak, Dahili Sunucu Hataları olmayacak, regexp'iniz hala doğru, kural sadece eşleşmeyecek. Django / genshi şablonlarıyla çok çalışıyorsanız ve ${}kas belleğinde değişken ikame için bu gerçekten iğrenç .


1
Evet, $ ikame değişkenleri son RewriteRule modeliyle, % değişkenler son RewriteCond modeliyle ve% {env: XXX}
TerryE

7

Boşa harcadığım birkaç saatten biri:

Tüm bu ipuçlarını uyguladıysanız ve sunucu hata günlüğüne erişiminiz olmadığı için yalnızca 500 hata alıyorsanız, sorun .htaccess'te değil, yönlendirdiği dosyalarda olabilir.

.Htaccess sorunumu çözdükten sonra, bazı izinleri unutmuş olsam bile, biraz daha düzeltmeye çalışarak iki saat daha harcadım.


Kişisel sitem için paylaşılan bir erişim barındırma web hizmeti kullanıyorum, ancak yaptığım, bunu PHP / Apache yapılandırma, ana dizin vb. Açısından kabaca yansıtan bir test VM kurmaktır. admin Herhangi bir zor .htaccesssorunu teşhis etmek için yeniden yazma günlüğünü etkinleştirebilirim .
TerryE

6

Ortam değişkenlerini ayarlayın ve almak için başlıkları kullanın:

OP tarafından belirtildiği gibi RewriteRule satırlarıyla yeni ortam değişkenleri oluşturabilirsiniz:

RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]

Ancak bir sunucu tarafı komut dosyasının çalışmasını sağlayamazsanız, bu ortam değişkenini nasıl okuyabilirsiniz? Bir çözüm bir başlık ayarlamaktır:

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

Değer , ortam değişkenleri için tanımlayıcı da dahil olmak üzere biçim tanımlayıcılarını kabul eder%{NAME}e (küçük harf e'yi unutmayın). Bazen, REDIRECT_öneki eklemeniz gerekir , ancak önek eklendiğinde ve eklenmediğinde çalışmadım.


Ön ekin ne zaman kullanılacağı veya kullanılmayacağı hakkında daha fazla fikir REDIRECT_edindiniz mi? Ayrıca, diğer (htaccess) bağlamlarda öneklerle ilgili terminolojiyi de görüyorum, ancak ne anlama geldiğini tam olarak açıklayamadım. Belirli komutları kullanırken (ancak diğer komutları değil) değişkeninizi önekle adlandırmanız veya öneki belirtilen değişkeninize eklemeniz gerektiği anlamına mı geliyor? Örneğiniz hem var tanımını hem de var kullanımını gösteren ilk örnektir, bu yüzden bundan sonra ikincisini düşünmeye meyilliyim! Dokümanlar çok az yardımcı oldu - çok fazla şey bildiğimizi ve çok az referans / bağlantı verdiğimizi varsayıyorlar.
SherylHohman

5

Yeniden yönlendirmeler oluşturuyorsanız, tarayıcı önbellek sorunlarını önlemek için kıvrılma ile test edin . Yalnızca http üstbilgilerini almak için -I kullanın. Tüm yönlendirmeleri takip etmek için -L tuşunu kullanın.


3

Mod_rewrite sorunlarımı hata ayıklamaya çalışırken bu soruyu buldum ve kesinlikle bazı yararlı tavsiyeler var. Ama sonuçta en önemli şey, normal ifade sözdiziminizin doğru olduğundan emin olmaktır. Kendi RE sözdizim ile ilgili sorunlar nedeniyle, regexpCheck.php betiğini yüklemek uygun bir seçenek değildi.

Ancak Apache Perl Uyumlu Düzenli İfadeler (PCRE) kullandığından, PCRE'lerin yazılmasına yardımcı olan herhangi bir araç yardımcı olacaktır. Geçmişte Java ve Javascript REs ile RegexPlanet aracını kullandım ve Perl'i de desteklediklerini bulmaktan mutluluk duydum.

Normal ifadenizi ve bir veya daha fazla örnek URL'yi yazmanız yeterlidir ve normal ifadenin eşleşip eşleşmediğini ("~ =" sütununda "1") ve varsa eşleşen grupları ("bölünmüş" sütunu, Apache'nin beklediği sayılara karşılık gelir; örneğin, 1 $, 2 $ vb.). PCRE desteğinin "beta sürümünde" olduğunu iddia ediyorlar, ancak sözdizimi sorunlarımı çözmek için ihtiyacım olan buydu.

http://www.regexplanet.com/advanced/perl/index.html

Mevcut bir cevaba basitçe bir yorum ekleyebilirdim ama itibarım henüz bu düzeyde değil. Umarım bu birine yardımcı olur.


güzel bir araç, ama korkunç bir form ... şu havalı araçlara göz atın : regex101.com veya refiddle.com veya regexr.com
hexerei yazılım 31:15

3

4. ile ilgili olarak, yine de tüm yeniden yazma tamamlandıktan sonra "kukla komut dosyası saplama" aslında hedef URL olduğundan emin olmanız gerekir, ya da hiçbir şey görmezsiniz!

Benzer / ilişkili bir hile ( bu soruya bakın ) aşağıdaki gibi geçici bir kural eklemektir:

RewriteRule (.*) /show.php?url=$1 [END]

show.phpSadece $_GETparametrelerini gösteren çok basit bir komut dosyası nerede (isterseniz ortam değişkenlerini de görüntüleyebilirsiniz).

Bu, yeniden yazmayı, hata ayıklayıcıdaki bir kesme noktası gibi kural kümesine eklediğiniz noktada durduracaktır.

Apache <2.3.9 kullanıyorsanız, [L]bunun yerine kullanmanız gerekir [END]ve ardından şunları eklemeniz gerekebilir :

RewriteRule ^show.php$ - [L]

Senin ruleset en üst kısmında, eğer URL /show.phpkendisidir yeniden ediliyor.


3

Yazarken gözlemlediğim bazı hatalar oluyor .htaccess

Birden çok ^(.*)$kuralda tekrar tekrar kullanılması ^(.*)$, diğer kuralların çoğu durumda iktidarsız kalmasına neden olur, çünkü tek bir isabetle tüm URL'lerle eşleşir.

Bu nedenle, bu url için kural kullanırsak, bu url'yi sapmle/urlde tüketir sapmle/url/string.


[L] kuralımızın işlenmesini sağlamak için flag kullanılmalıdır.


Bilmeniz gerekenler:

% N ve $ n arasındaki fark

%n, %{RewriteCond}parça sırasında eşleştirilir ve parça $nile eşleşir %{RewriteRule}.

RewriteBase'in çalışması

RewriteBase yönergesi, göreli yolun yerine geçen dizin başına (htaccess) RewriteRule yönergeleri için kullanılacak URL önekini belirtir.

Bu yönerge, aşağıdaki koşullardan biri doğru olmadığı sürece dizin başına (htaccess) bağlamında bir ikamede göreli bir yol kullandığınızda gereklidir:

Orijinal istek ve değiştirme, DocumentRoot'un altındadır (Takma ad gibi başka yollarla erişilemez). RewriteRule içeren dizinin göreli ikameyle eklenmiş dosya sistemi yolu, sunucuda bir URL yolu olarak da geçerlidir (bu nadirdir). Apache HTTP Sunucusu 2.4.16 ve sonraki sürümlerinde, istek Alias ​​veya mod_userdir ile eşlendiğinde bu yönerge atlanabilir.


2

.Htacesss içinde yalnızca bir satırdan fazla kural yazmayı planlıyorsanız,
hata ayıklamak için bu düzeltme yöntemlerinden birini denemeyi bile düşünmeyin.

Sadece nihayet vazgeçmek için, LOG'lardan geribildirim olmadan, birden fazla kural belirleyerek gün boşa.
Bilgisayarımda Apache aldım, tüm siteyi HDD'sine kopyaladım ve tüm kural setini günlükleri kullanarak çok hızlı bir şekilde sıraladım.
Sonra çalışan eski kurallarımı gözden geçirdim. Gerçekten istediklerini yapmadıklarını gördüm. Biraz farklı bir adres verilen bir saatli bomba.

Yeniden yazma kurallarında çok fazla çukur düşmesi var, bu hiç de mantıklı bir şey değil.
Apache'yi on dakika içinde çalışır hale getirebilirsiniz, 10MB, iyi lisans, * NIX / WIN / MAC hazır, yüklemeden bile.
Ayrıca, sunucunuzun başlık satırlarını kontrol edin ve eskiyse arşivlerinden aynı Apache sürümünü edinin. OP'm hala 2.0'da; pek çok şey desteklenmez.


papo, geliştirme yapımda özel sunucular, ISS tarafından barındırılan VPS ve özel VM'ler çalıştırıyorum, ancak genel olarak etki alanlarım ve e-postalarım için paylaşılan bir barındırma hizmeti kullanıyorum, çünkü tam olarak yönetilen kullanımı daha uygun ve uygun maliyetli olduğu için bunlar için hizmet. Bu nasıl yapılır, paylaşılan hizmet kullanıcılarını gerçekten hedefler. Özel bir VM'yi paylaşılan bir hizmeti tam olarak yansıtacak şekilde yapılandırmak zordur. Evet, daha sonra bir test VM kullanarak yardımcı olabilir, ancak yine de bu "hileler" zaman zaman paylaşılan hizmetimde kullanıyorum.
TerryE

1
Bunun kabul edeceğini eğer senin bir hata ayıklama için alternatif öneri olarak çerçeveli olmuştu mod_rewritekuralları, ancak açılış "Hatta bu konuda sanmıyorum" kendi anlamak için mücadele eden temel paylaşılan hizmet kullanıcıları için sadece kötü tavsiyem htaccessdosyalar 'değiller t Yapmaları gereken şeylerle çalışmak.
TerryE

Eğer güzel bir tavsiye koleksiyonu bir araya getirmek işinizi değersiz gibi geliyorsa üzgünüm. Bunu istemedim. İnan bana, bu konu sunulan birçok tavsiye okumak ve takip etmek çok mutlu oldu. Ama kurallarım yavaş yavaş karmaşıklaştı ve sonunda, bir Apache sunucusu kurma ve hata ayıklamayı yapılması gerektiği gibi yapmaktan kaçınmak istemeyerek çok fazla zaman harcadım. Dahası, günlüklerde, gerçekte neler olduğunu görmediğim gibi hiçbir şey öğrenmedim. Ve bir sürü şey oluyor. Bu deneyimi paylaşmanın da değerli olduğuna inanıyorum.
papo

ikinci bölüm için bir EĞER vardır. Metnim asla 'aklından bile geçirme' ile başlamadı Şimdi görüyorum, bu ifadeler biraz sert görünüyor ama hepsi doğru. Özellikle bu konuda yeni olan ve anlamakta zorlananlar için. Buradaki tavsiyeleri onları yanlış yönlendirebilir, benim gibi, ihtiyacım olan tek şey katı bir regex, bu sizin için basit değil, 6. noktanız gibi) PATH_INFO'nun bana çok fazla maliyeti var ve dediğin gibi bir hata değil, bir özellik. Yeniden eklenmesini istemiyorsanız [DPI] kullanın. Ancak yalnızca günlüklere bakarsanız, bunun eklendiğini görürsünüz. Bu nedenle, birden fazla satır ve günlükleri kullanmaktan daha iyi olursunuz
papo

1
Maalesef @papo, ama -1 oy için nedenim bunun "aklından bile geçirme" nin kötü tavsiye olduğunu, IMO olduğunu düşünüyorum. Demek istediğin "belli bir karmaşıklığın üstünde, o zaman .htaccessdosyalarınızın hatalarını ayıklamak için yerel bir Apache hizmeti yüklemek daha kolay olabilir " ise, o zaman bu daha dengelidir. Evet, yerel bir Apache hizmeti kurmak oldukça kolaydır, ancak bir hizmet sağlayıcısının paylaşılan barındırma hizmetini yansıtması karmaşık olabilir ve Wordpress'in tek tıklamayla kurulumunu kullanmış olabilecek birçok kullanıcının beceri düzeyinin ötesinde, söyleyin ve dosyalarıyla ilgili sorunlarınız var .htaccess.
TerryE

1

Bunu burada, belki de açık bir ayrıntıda bırakacağım, ama saatlerce kafamı vuracağım : Dikkatli olun %{REQUEST_URI}çünkü @Krist van Besien'in cevabında söylediği şey tamamen doğru, ancak REQUEST_URI dizesi için değil , çünkü bunu koymak TestString a ile başlar /. Bu yüzden dikkatli olun:

RewriteCond %{REQUEST_URI} ^/assets/$  
                            ^
                            | check this pesky fella right here if missing

0

(Doin fikrine benzer) Neyin eşleştiğini göstermek için bu kodu kullanıyorum

$keys = array_keys($_GET);
foreach($keys as $i=>$key){
    echo "$i => $key <br>";
}

Sunucu kökünde r.php kaydedin ve sonra .htaccess içinde bazı testler yapın
Örneğin, ben bir dil öneki ile başlayan URL'leri eşleştirmek istiyorum

RewriteRule ^(?!(en|de)/)(.*)$ /r.php?$1&$2 [L] #$1&$2&...
RewriteRule ^(.*)$ /r.php?nomatch [L] #report nomatch and exit

1
sadece O / P nokta 4'te bahsettiğim gibi bir phpinfo () saplama kullanarak temelde aynı şeyi yapar. BakQUERY_STRING
TerryE

0

@JCastell tarafından işaret edildiği gibi, çevrimiçi testçi, bir yönlendirmeleri bir .htaccess dosyasına karşı test etmek için iyi bir iş çıkarır . Bununla birlikte, bir json nesnesi kullanarak bir url listesini toplu olarak test etmek için kullanılabilecek api daha ilginçtir . Ancak, daha kullanışlı hale getirmek için , url listesini göndermek ve hsoncess dosyasında eşleşen satır numarası ve kural ile CSV biçimli bir çıktıya json yanıtını ayrıştırmak için curl ve jq kullanan küçük bir bash komut dosyası yazdım yönlendirilen URL ile birlikte, bir e-tablodaki URL listesinin karşılaştırılmasını ve hangi kuralların çalışmadığını hızlı bir şekilde belirlemeyi oldukça kullanışlı hale getirir.


-1

URL ile çalışıyorsanız, "Mod Yeniden Yazmayı Etkinleştir" seçeneğini kontrol etmek isteyebilirsiniz

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.