Wskazówki dotyczące debugowania reguł przepisywania .htaccess

272

Wiele plakatów ma problemy z debugowaniem instrukcji RewriteRule i RewriteCond w swoich .htaccessplikach. Większość z nich korzysta ze wspólnej usługi hostingowej i dlatego nie ma dostępu do konfiguracji serwera głównego. Nie mogą uniknąć używania .htaccessplików do przepisywania i nie mogą włączyć RewriteLogLevel ", jak sugeruje wielu respondentów. Istnieje również wiele .htaccessspecyficznych pułapek i ograniczenia nie są dobrze uwzględnione. Konfigurowanie lokalnego testowego stosu LAMP wymaga zbyt dużej krzywej uczenia się dla większości .

Więc moje pytanie tutaj polega na tym, jak zalecamy samodzielne debugowanie reguł . Poniżej podaję kilka sugestii. Inne sugestie będą mile widziane.

  1. Zrozum, że silnik mod_rewrite zmienia .htaccesspliki . Silnik działa w tej pętli:

    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
    

    Twoje reguły będą wykonywane wielokrotnie, a jeśli zmienisz ścieżkę URI, może to spowodować wykonanie innych .htaccessplików, jeśli istnieją. Upewnij się, że zakończysz tę pętlę, jeśli to konieczne, dodając dodatkowe, RewriteCondaby zatrzymać uruchamianie reguł. Usuń także wszystkie .htaccesszestawy reguł przepisywania niższego poziomu, chyba że wyraźnie zamierzasz używać zestawów reguł wielopoziomowych.

  2. Upewnij się, że składnia każdego Regexp jest poprawna , testując zestaw wzorców testowych, aby upewnić się, że jest to poprawna składnia i robi to, co zamierzasz z pełnym zakresem testowych identyfikatorów URI. Zobacz odpowiedź poniżej, aby uzyskać więcej informacji.

  3. Twórz swoje reguły stopniowo w katalogu testowym. Możesz skorzystać z opcji „wykonaj najgłębszy .htaccessplik na ścieżce”, aby skonfigurować osobny katalog testowy (drzewo) i debugować tutaj zestawy reguł bez zepsucia głównych zasad i zatrzymania działania witryny. Musisz je dodawać pojedynczo, ponieważ jest to jedyny sposób zlokalizowania awarii poszczególnych reguł.

  4. Użyj fałszywego kodu pośredniczącego do zrzucenia zmiennych serwera i środowiska . (Patrz Listing 2 ) Jeśli Twoja aplikacja używa, powiedzmy, blog/index.phpmożesz to skopiować test/blog/index.phpi użyć do przetestowania swoich reguł blogów w testpodkatalogu. Możesz także użyć zmiennych środowiskowych, aby upewnić się, że silnik przepisywania poprawnie interpretuje ciągi podstawień, np

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

    i poszukaj tych zmiennych REDIRECT_ * w zrzutu phpinfo. BTW, użyłem tego i odkryłem na mojej stronie, że musiałem %{ENV:DOCUMENT_ROOT_REAL}zamiast tego użyć . W przypadku zapętlenia readresatora zmienne REDIRECT_REDIRECT_ * wyświetlają poprzednie przejście. Itp..

  5. Upewnij się, że przeglądarka nie ugryzie Cię w buforowaniu niepoprawnych przekierowań 301 . Zobacz odpowiedź poniżej . Dziękuję za to Ulrichowi Palha .

  6. Mechanizm przepisywania wydaje się wrażliwy na kaskadowe reguły w .htaccesskontekście (czyli tam, gdzie RewriteRuleskutkuje to podstawieniem, a to sprowadza się do dalszych reguł), ponieważ znalazłem błędy w wewnętrznych żądaniach podrzędnych (1) i nieprawidłowe przetwarzanie PATH_INFO, które często zapobiega się za pomocą flag [NS], [L] i [PT].

Więcej komentarzy lub sugestii?

Listing 1 - phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);
TerryE
źródło
10
Są dobre ... Być może powinieneś przenieść je z pytania na odpowiedź.
w00t
@ w00t, podzieliłem sprawdzanie wyrażenia regularnego zgodnie z twoją sugestią, ponieważ chcę odesłać go przez link w innych odpowiedziach.
TerryE
3
Możesz dodać schemat kontroli z dokumentów do pierwszej sugestii. IMO jest o wiele łatwiejsze do zrozumienia niż jakikolwiek pseudokod lub wyjaśnienie, a to jest naprawdę najczarniejsza część voodoo modyfikującego mod.
SáT
Numer 6 to wielka sprawa. Reguły przepisywania zachowujące się inaczej w standardowych plikach konfiguracyjnych apache w porównaniu do plików .htaccess muszą złapać wielu ludzi.
Iain Collins
Coś, co może być warte dodania do tych wskazówek: poświęciłem trochę czasu na debugowanie problemu z przekierowaniem i nie przepisywaniem. Okazuje się, że miałem przepisywanie do „/ comment”, kiedy chciałem „/ comment /”. Przepisywanie do „/ comment”, a następnie serwer przekierowywał do „/ comment /”. Oczywiste zachowanie w stosunku do osób przyzwyczajonych do Apache, ale prawdopodobnie mniej w przypadku noobów takich jak ja.
Chris

Odpowiedzi:

132

Oto kilka dodatkowych wskazówek na temat reguł testowania, które mogą ułatwić debugowanie użytkownikom na hostingu współdzielonym

1. Użyj agenta fałszywego użytkownika

Podczas testowania nowej reguły dodaj warunek, aby wykonać ją tylko z klientem fakeużytkownika, którego będziesz używać dla swoich żądań. W ten sposób nie wpłynie to na nikogo w Twojej witrynie.

na przykład

#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] 

Jeśli używasz przeglądarki Firefox, możesz użyć przełącznika User Agent Switcher, aby utworzyć fałszywy ciąg agenta użytkownika i przetestować go.

2. Nie używaj 301, dopóki nie zakończysz testowania

Widziałem tak wiele postów, w których ludzie wciąż testują swoje reguły i używają 301. NIE .

Jeśli nie korzystasz z sugestii 1 na swojej stronie, nie tylko Ty, ale każdy odwiedzający Twoją witrynę w tym czasie będzie miał wpływ na 301.

Pamiętaj, że są trwałe i agresywnie buforowane w przeglądarce. Zamiast tego używaj 302, a następnie zmień na 301.

3. Pamiętaj, że 301 są agresywnie buforowane w przeglądarce

Jeśli twoja reguła nie działa i wygląda dobrze dla Ciebie, a nie korzystałeś z sugestii 1 i 2, to ponownie przetestuj po wyczyszczeniu pamięci podręcznej przeglądarki lub podczas prywatnego przeglądania.

4. Użyj narzędzia przechwytywania HTTP

Użyj narzędzia przechwytywania HTTP, takiego jak Fiddler, aby zobaczyć rzeczywisty ruch HTTP między przeglądarką a serwerem.

Podczas gdy inni mogą powiedzieć, że twój site does not look right, możesz zamiast tego to zobaczyć i zgłosić all of the images, css and js are returning 404 errors, szybko zawężając problem.

Podczas gdy inni poinformują cię started at URL A and ended at URL C, będziesz mógł zobaczyć, że zaczęli od URL A, were 302 redirected to URL B and 301 redirected to URL C. Nawet jeśli URL C był ostatecznym celem, będziesz wiedział, że jest to niekorzystne dla SEO i wymaga naprawy.

Będziesz mógł zobaczyć nagłówki pamięci podręcznej ustawione po stronie serwera, odtwarzać żądania, modyfikować nagłówki żądań w celu przetestowania ...


Ulrich Palha
źródło
9
Ulrich, wielkie dzięki za ten wkład. Podjąłeś pewne aspekty, których nie myślałem o umieszczeniu na mojej liście. W przypadku debugowania 301 używam Chrome w „Prywatnym przeglądaniu” (AKA „Tryb pornograficzny”), ponieważ powoduje to zrzucenie informacji o stanie po zamknięciu okna. Mam nadzieję, że nie przeszkadza mi to, że nie „akceptuję” tego, co jest ważnym punktem, ale nie jedną najlepszą odpowiedzią. Dzięki jeszcze raz. :)
TerryE
1
Aby to wyjaśnić (masz go w kodzie, ale go nie zauważyłeś), ale upewnij się, że używasz przekierowania 302, a nie 301, czego potrzebujesz[L,R=302]
icc97 12.02.13
6
Nie musisz wyraźnie określać, [L, R=302]po prostu zrób [L,R]domyślną wartość302
Rahil Wazir
2
@goodeye, spójrz także na pole „Chrome> Ustawienia> Ogólne> Wyłącz pamięć podręczną, gdy DevTools jest otwarte”.
johnsnails
83

Testy przepisywania online .htaccess

Znalazłem ten Googling dla RegEx pomoc, to zaoszczędziło mi dużo czasu z konieczności przesłać nowe .htaccesspliki za każdym razem robię małą modyfikację.

ze strony:

tester htaccess

Aby przetestować reguły przepisywania htaccess, po prostu wypełnij adres URL, do którego stosujesz reguły, umieść zawartość swojego htaccess na większym obszarze wprowadzania i naciśnij przycisk „Sprawdź teraz”.

JCastell
źródło
6
Dzięki za wskaźnik do tego narzędzia, który znalazłem najbardziej bezpośredni sposób na debugowanie mojego problemu.
BobHy,
Jeśli masz dostęp ssh do swojej przestrzeni internetowej, inną opcją jest zmiana .htaccess bezpośrednio przez edytor na serwerze.
sjas
Będziesz musiał zignorować ostrzeżenie ssl b / c, że certyfikat witryn ma problemy. Ale strona wciąż tam jest. To najlepsze i najłatwiejsze rozwiązanie. Daje niesamowity wgląd w to, co jest nie tak, i powoduje SZYBKĄ naprawę problemu.
toddmo
Dziękujemy za wskazanie tego narzędzia. Jest to pomocne, czasami debugowanie samego apache htaccess jest bardzo trudne. Dzięki. Wielkie dzięki
Benyamin Limanto
Wydaje się, że odnośnik jest błędny i nie zawsze daje dokładne wyniki. Sprawdź absolutnie apache, aby mieć absolutną pewność.
Parth
13

Nie zapominaj, że w plikach .htaccess jest to dopasowany względny adres URL.

W pliku .htaccess następująca reguła RewriteR nigdy nie będzie pasować:

RewriteRule ^/(.*)     /something/$s
Krist van Besien
źródło
4
Tak, ciąg wprowadzony do reguły Rewrite jest względny i dlatego jest usuwany z każdego wiodącego /, ale to usuwanie nie występuje w przypadku ciągów dopasowań zestawionych w poleceniach Rewrite Cond .
TerryE
8

Upewnij się, że składnia każdego Regexp jest poprawna

testując zestaw wzorców testowych, aby upewnić się, że jest to poprawna składnia i działa zgodnie z Twoim zamierzeniem, korzystając z pełnego zakresu testowych identyfikatorów URI.

Zobacz regexpCheck.php poniżej, aby uzyskać prosty skrypt, który możesz dodać do katalogu prywatnego / testowego w swojej witrynie, aby to zrobić. Trzymałem to krótko, a nie ładnie. Wklej to do plikuregexpCheck.php w katalogu testowym, aby użyć go na swojej stronie. Pomoże to w utworzeniu wyrażenia regularnego i przetestowaniu go na liście przypadków testowych. Używam tutaj silnika PHP PCRE, ale po przyjrzeniu się źródłu Apache jest on zasadniczo identyczny z tym używanym w Apache. Istnieje wiele poradników i samouczków, które zawierają szablony i mogą pomóc Ci rozwinąć umiejętności wyrażania regularnego.

Listing 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>
TerryE
źródło
1
Szybka uwaga: import_request_variableszostał wycofany w PHP 5.3 i usunięty w 5.4. extract($_GET)w połączeniu z extract($_POST)może wykonywać tę samą funkcję, ale wszystkie zmienne wymagałyby usunięcia prefiksu z ich nazwy. Źródło: php.net/manual/en/function.import-request-variables.php
Jeff Lambert
@ obserwator, dzięki. Zaktualizowałem moją wersję lokalną, aby była zgodna z wersją 5.4 rok temu, ale zapomniałem zmienić ten post. Teraz gotowe.
TerryE
o mój, nawet po edycji, nie mogę uzyskać dobrych rezultatów po prostu przez skopiowanie kodu ... ale przy regexowych skrzypcach, myślę, że twoje narzędzie i tak jest przestarzałe. sprawdź te fajne narzędzia: regex101.com lub refiddle.com lub regexr.com
oprogramowanie hexerei
@hexereisoftware, ten post ma 3 lata, więc mogą występować subtelne problemy w zależności od używanej wersji PHP i wersji Apache. Istnieje jednak wiele wariantów wyrażenia regularnego, z których każdy ma subtelne różnice. Jak powiedziałem, kod Apache wykorzystuje silnik PCRE, który jest bardzo podobny do silnika PHP. Nie jestem pewien, jakie są różnice w innych wariantach, takich jak .Net, więc chociaż twoja sugestia korzystania z zasobów online jest dobra, trzymałbym się tej, która wyraźnie obsługuje składnię apache lub PHP. :-)
TerryE
Perl byłby najbliżej, ale php używa tej samej składni
oprogramowanie hexerei
7

Upewnij się, że używasz znaku procentu przed zmiennymi, a nie znaku dolara.

To %{HTTP_HOST}, nie ${HTTP_HOST} . W dzienniku błędów nie będzie nic, nie będzie żadnych wewnętrznych błędów serwera, wyrażenie regularne nadal jest poprawne, reguła po prostu się nie zgadza. Jest to naprawdę ohydne, jeśli często pracujesz z szablonami django / genshi i masz ${}zmienne podstawianie w pamięci mięśni.

Szymon
źródło
1
Tak, zmienne podstawienia $ odnoszą się do ostatniego wzorca RewriteRule, a % zmienne odnoszą się do ostatniego wzorca RewriteCond i specjalizacji, takich jak% {env: XXX}
TerryE
7

Jeden z kilku godzin, które zmarnowałem:

Jeśli zastosowałeś wszystkie te wskazówki i napotykasz tylko 500 błędów, ponieważ nie masz dostępu do dziennika błędów serwera, być może problem nie dotyczy pliku .htaccess, ale plików, do których przekierowuje.

Po naprawieniu problemu z .htaccess spędziłem dwie godziny, próbując go naprawić, chociaż po prostu zapomniałem o niektórych uprawnieniach.

Ruben
źródło
Korzystam z usługi hostingowej z dostępem współdzielonym dla mojej osobistej strony, ale zrobiłem to, aby skonfigurować testową maszynę wirtualną, która z grubsza odzwierciedla to w zakresie konfiguracji PHP / Apache, katalogu domowego itp. Jednak ponieważ ta maszyna wirtualna jest pod moim admin Mogę włączyć przepisywanie zapisu, aby zdiagnozować wszelkie trudne .htaccessproblemy.
TerryE
6

Ustaw zmienne środowiskowe i użyj nagłówków, aby je otrzymać:

Możesz tworzyć nowe zmienne środowiskowe za pomocą wierszy RewriteRule, jak wspomniano w OP:

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

Ale jeśli nie możesz uruchomić skryptu po stronie serwera, jak możesz odczytać tę zmienną środowiskową? Jednym z rozwiązań jest ustawienie nagłówka:

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

Wartość akceptuje specyfikatory formatu , w tym %{NAME}especyfikator zmiennych środowiskowych (nie zapomnij o małych literach e). Czasami musisz dodać REDIRECT_prefiks, ale nie opracowałem, kiedy prefiks zostanie dodany, a kiedy nie.

Flimm
źródło
Czy uzyskałeś lepszy wgląd w to, kiedy używać REDIRECT_prefiksu, czy nie ? Widzę także terminologię dotyczącą prefiksów w innych kontekstach (htaccess), ale nigdy nie było jasne, co dokładnie oznacza. Czy to oznacza, że ​​musisz nazwać swoją zmienną prefiksem, czy dodać prefiks do nazwanej zmiennej, gdy używasz niektórych poleceń (ale nie innych poleceń)? Twój przykład jest pierwszym, który pokazuje zarówno definicję var, jak i użycie var, więc od tego jestem skłonny myśleć o tym drugim! Dokumenty niewiele pomogły - zakładają, że wiemy za dużo i podają za mało referencji / linków.
SherylHohman,
5

Jeśli tworzysz przekierowania, przetestuj zwijanie, aby uniknąć problemów z buforowaniem przeglądarki. Użyj -I, aby pobrać tylko nagłówki http. Użyj -L, aby śledzić wszystkie przekierowania.

flm
źródło
3

Znalazłem to pytanie, próbując debugować moje problemy z mod_rewrite, i na pewno zawiera kilka przydatnych porad. Ale w końcu najważniejsze jest upewnienie się, że masz poprawną składnię wyrażeń regularnych. Z powodu problemów z moją własną składnią RE instalowanie skryptu regexpCheck.php nie było wykonalną opcją.

Ale ponieważ Apache używa wyrażeń regularnych kompatybilnych z Perlem (PCRE), każde narzędzie, które pomaga pisać PCRE, powinno pomóc. W przeszłości korzystałem z narzędzia RegexPlanet w środowisku Java i JavaScript RE i cieszyłem się, że obsługują one również Perla.

Po prostu wpisz wyrażenie regularne i co najmniej jeden przykładowy adres URL, a dowiesz się, czy wyrażenie regularne pasuje („1” w kolumnie „~ =”) i, jeśli ma to zastosowanie, dowolne pasujące grupy (liczby w „podziale” kolumna będzie odpowiadać liczbom, których oczekuje Apache, np. 1 USD, 2 USD itp.) dla każdego adresu URL. Twierdzą, że obsługa PCRE jest „w wersji beta”, ale właśnie tego potrzebowałem, aby rozwiązać problemy ze składnią.

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

Po prostu dodałbym komentarz do istniejącej odpowiedzi, ale moja reputacja nie jest jeszcze na tym poziomie. Mam nadzieję, że to komuś pomoże.

Lambart
źródło
fajne narzędzie, ale okropna forma ... sprawdź te fajne narzędzia: regex101.com lub refiddle.com lub regexr.com
oprogramowanie hexerei
3

W odniesieniu do 4. nadal musisz upewnić się, że „sztuczny skrót skryptowy” jest faktycznie docelowym adresem URL po zakończeniu całego przepisywania, w przeciwnym razie nic nie zobaczysz!

Podobną / pokrewną sztuczką (patrz to pytanie ) jest wstawienie tymczasowej reguły, takiej jak:

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

Gdzie show.phpjest bardzo prosty skrypt, który wyświetla tylko jego $_GETparametry (możesz także wyświetlić zmienne środowiskowe, jeśli chcesz).

Spowoduje to zatrzymanie przepisywania w miejscu, w którym wstawisz go do zestawu reguł, raczej jak punkt przerwania w debuggerze.

Jeśli używasz Apache <2.3.9, będziesz musiał użyć [L]zamiast [END], a następnie może być konieczne dodanie:

RewriteRule ^show.php$ - [L]

Na samej górze zestawu reguł, jeśli sam adres URL /show.phpjest przepisywany.

Doin
źródło
3

Niektóre błędy, które zaobserwowałem, zdarzają się podczas pisania .htaccess

Używanie ^(.*)$powtarzające się w wielu regułach, używanie ^(.*)$powoduje , że inne reguły są w większości przypadków bezsilne, ponieważ dopasowuje cały adres URL w jednym trafieniu.

Tak więc, jeśli używamy reguły dla tego adresu URL sapmle/url, zostanie on również wykorzystany sapmle/url/string.


[L] należy użyć flagi, aby upewnić się, że nasza reguła zakończyła przetwarzanie.


Powinien wiedzieć o:

Różnica w% ni $ n

%njest dopasowany podczas %{RewriteCond}części i $nto mecze na %{RewriteRule}części.

Działanie RewriteBase

Dyrektywa RewriteBase określa prefiks adresu URL, który będzie używany w przypadku dyrektyw RewriteRule dla katalogu (htaccess), które zastępują ścieżkę względną.

Ta dyrektywa jest wymagana, jeśli używasz ścieżki względnej w podstawieniu w kontekście dla katalogu (htaccess), chyba że spełniony jest jeden z poniższych warunków:

Pierwotne żądanie i podstawienie znajdują się pod DocumentRoot (w przeciwieństwie do osiągalnego za pomocą innych środków, takich jak Alias). Ścieżka systemu plików do katalogu zawierającego RewriteRule, z przyrostkiem względnym podstawienia, jest również poprawna jako ścieżka adresu URL na serwerze (jest to rzadkie). W Apache HTTP Server 2.4.16 i nowszych dyrektywę tę można pominąć, gdy żądanie jest mapowane przez Alias ​​lub mod_userdir.

Abhishek Gurjar
źródło
2

Jeśli planujesz napisać więcej niż jedną linię reguł w .htacesss,
nawet nie myśl o wypróbowaniu jednej z tych metod poprawki w celu jej debugowania.

Zmarnowałem dni na ustawianie wielu reguł, bez informacji zwrotnych od LOG, tylko po to, żeby się poddać.
Mam Apache na komputerze, skopiowałem całą witrynę na dysk twardy i cały zestaw reguł uporządkowałem, używając dzienników, naprawdę szybko.
Następnie przejrzałem moje stare zasady, które działały. Widziałem, że tak naprawdę nie robili tego, co było pożądane. Bomba zegarowa, pod nieco innym adresem.

W przepisach przepisywania jest tak dużo upadków, że to wcale nie jest prosta logika.
Możesz uruchomić Apache w dziesięć minut, to 10 MB, dobra licencja, gotowość * NIX / WIN / MAC, nawet bez instalacji.
Sprawdź także wiersze nagłówka swojego serwera i pobierz tę samą wersję Apache z ich archiwum, jeśli jest stara. Mój OP jest nadal w wersji 2.0; wiele rzeczy nie jest obsługiwanych.

papo
źródło
papo, w mojej strukturze programistycznej uruchomiłem dedykowane serwery, hostowane przez ISP VPS i prywatne maszyny wirtualne, ale nadal korzystam z usług hostingu współdzielonego dla moich domen publicznych i poczty e-mail, po prostu dlatego, że wygodniej i taniej jest korzystać z w pełni zarządzanego obsługa tych. To howto jest naprawdę skierowane do użytkowników usług wspólnych. Skonfigurowanie prywatnej maszyny wirtualnej w celu pełnego odzwierciedlenia usługi udostępnionej jest trudne. Tak, jeśli możesz wtedy skorzystać z testowej maszyny wirtualnej, to wciąż korzystam z tych „sztuczek” w mojej usłudze współdzielonej.
TerryE
1
Zgodziłbym się z tym, gdyby twoje A zostało sformułowane jako alternatywna propozycja dla mod_rewritereguł debugowania , ale otwarcie „nawet o tym nie myśl” to po prostu zła rada dla podstawowych użytkowników usług wspólnych, którzy starają się zrozumieć, dlaczego ich htaccesspliki nie są t działają tak, jak powinny.
TerryE
Przepraszam, jeśli zabrzmiało to, że twoja praca polegająca na zebraniu ładnej kolekcji porad była bezwartościowa. Nie chciałem tego Uwierz mi, byłem bardzo szczęśliwy, czytając i podążając za wieloma wskazówkami dotyczącymi tego wątku. Ale moje zasady powoli się komplikowały, a na koniec zmarnowałem dużo czasu, po prostu nie chcąc instalować serwera Apache i przeprowadzać debugowania tak, jak należy. Co więcej, niczego się nie nauczyłem, bo nie widziałem w dziennikach, co się naprawdę dzieje. I dzieje się wiele rzeczy. Uważam, że warto podzielić się tym doświadczeniem.
papo
w drugiej części jest IF. Mój tekst nigdy nie zaczynał się od „nawet nie myśl o” Widzę teraz, to sformułowanie wydaje się nieco surowe, ale to wszystko prawda. Szczególnie dla tych, którzy są w tym nowi i starają się zrozumieć. Radzę, że mogę wprowadzić ich w błąd, tak jak ja, że ​​wszystko, czego potrzebuję, to solidny regex, nie jest to takie proste, jak twój punkt 6) PATH_INFO kosztowało mnie wiele kłopotów i nie jest to błąd, jak mówisz, ale funkcja. Jeśli nie chcesz, aby to było dodawane ponownie, użyj [DPI]. Ale tylko jeśli spojrzysz na dzienniki, zobaczysz, że są tam dodawane. Dlatego więcej niż jedna linia i lepiej jest używać dzienników
papo
1
Przepraszam @papo, ale moim powodem do głosowania -1 było to, że uważam, że to „nawet o tym nie myśl” to zła rada, IMO. Jeśli chodziło Ci o to, że „powyżej pewnej złożoności może być łatwiej zainstalować lokalną usługę Apache w celu debugowania .htaccessplików”, to jest to bardziej zrównoważone. Tak, konfiguracja lokalnej usługi Apache jest dość łatwa, ale jej odzwierciedlenie we wspólnej usłudze hostingowej dostawcy usług może być skomplikowane i wykraczać poza poziom umiejętności wielu użytkowników, którzy mogli skorzystać z konfiguracji Wordpress za jednym kliknięciem, powiedz i masz problemy z .htaccessplikiem.
TerryE
1

Zostawię to tutaj, być może oczywisty szczegół, ale zmusiłem mnie do uderzania głową przez wiele godzin: używaj ostrożnie, %{REQUEST_URI}ponieważ to, co powiedział @Krist van Besien w swojej odpowiedzi, jest całkowicie poprawne, ale nie dla ciągu REQUEST_URI , ponieważ wyjście z tego TestString zaczyna się od /. Uważaj więc:

RewriteCond %{REQUEST_URI} ^/assets/$  
                            ^
                            | check this pesky fella right here if missing
Gruber
źródło
0

(Podobne do pomysłu Doin) Aby pokazać, co jest dopasowane, używam tego kodu

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

Zapisz go w pliku r.php w katalogu głównym serwera, a następnie wykonaj testy w .htaccess.
Na przykład chcę dopasować adresy URL, które nie zaczynają się od prefiksu języka

RewriteRule ^(?!(en|de)/)(.*)$ /r.php?$1&$2 [L] #$1&$2&...
RewriteRule ^(.*)$ /r.php?nomatch [L] #report nomatch and exit
UnLoCo
źródło
1
samo użycie kodu pośredniczącego phpinfo (), jak wspomniałem w punkcie 4 na moim O / P, robi w zasadzie to samo. PoszukajQUERY_STRING
TerryE
0

jak wskazał @JCastell, tester online wykonuje dobrą robotę, testując poszczególne przekierowania na pliku .htaccess. Jednak bardziej interesujące jest udostępnienie interfejsu API, którego można użyć do testowania wsadowego listy adresów URL przy użyciu obiektu json. Jednak, aby uczynić go bardziej użytecznym, napisałem mały plik skryptu bash, który wykorzystuje curl i jq do przesłania listy adresów URL i parsowania odpowiedzi json w formacie CSV z numerem wiersza i regułą dopasowaną w pliku htaccess wraz z przekierowanym adresem URL, dzięki czemu bardzo przydatne jest porównanie listy adresów URL w arkuszu kalkulacyjnym i szybkie ustalenie, które reguły nie działają.

Aurovrata
źródło
-1

Jeśli pracujesz z adresem URL, możesz chcieć sprawdzić, czy „Enable Mod Rewrite”

Aransiola Oluwaseun
źródło