[PHP][Access]MOD_REWRITE - .htaccess - Problem z RewriteCond %{ENV:REDIRECT_STATUS} ^$, Zapętlanie przekierowania i błąd AH00124 |
[PHP][Access]MOD_REWRITE - .htaccess - Problem z RewriteCond %{ENV:REDIRECT_STATUS} ^$, Zapętlanie przekierowania i błąd AH00124 |
4.07.2018, 17:07:42
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 4.07.2018 Ostrzeżenie: (0%) |
Witam, używałem szukajki u góry ale średnio mogę znaleźć odpowiedź na swoje pytanie, rzecz zapewne banalna dla pro'sów. Tak więc mam plik .htaccess
Cytat Options -Indexes Options -MultiViews RewriteEngine On RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-l RewriteRule ^(.+)$ /1/public/index.php?url=$1 [QSA,L] Staram się rozkminić czemu gdy usunę: Cytat RewriteCond %{ENV:REDIRECT_STATUS} ^$ W error logu dostaję taki komunikat: Cytat "[Wed Jul 04 17:22:31.926542 2018] [core:error] [pid 10408:tid 1948] [client ::1:61285] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace." Zapytanie przekroczyło limit 10 przekierowań? Przeczytałem już sporo wątków na Stacku ale wciąż nie dokońca rozumiem, w jaki sposób ta linijka: Cytat RewriteCond %{ENV:REDIRECT_STATUS} ^$ Powoduję "naprawę" tego błędu. Tzc tak próbując odczytać tę linijkę - "Jeśli zmienna środowiskowa STATUS (czyli ona zwraca jakiś błąd tak?), pasuję do wzoru - mam ^$ (znak początku i końca tekstu w wyrażeniach regularnych) jest pusta? Dopiero wtedy dopuszcza do przekierowania. Zawsze się staram szukać, ale już tyle internetu przekopałem i nie mam pomysłu czemu się zapętla (o ile się zapętla) i co mi daję ta linia w RewriteCond. Proszę chociaż o nakierowanie na temat. Z góru dziękuje. Pozdrawiam. |
|
|
4.07.2018, 20:16:14
Post
#2
|
|
Grupa: Zarejestrowani Postów: 286 Pomógł: 46 Dołączył: 10.01.2016 Ostrzeżenie: (0%) |
https://httpd.apache.org/docs/2.4/mod/mod_r...tml#rewritecond
RewriteCond Directive Description: Defines a condition under which rewriting will take place Syntax: RewriteCond TestString CondPattern [flags] ...* %{ENV:variable}, where variable can be any environment variable, is also available. This is looked-up via internal Apache httpd structures and (if not found there) via getenv() from the Apache httpd server process. https://httpd.apache.org/docs/2.4/custom-error.html ...* REDIRECT_ environment variables are created from the environment variables which existed prior to the redirect. They are renamed with a REDIRECT_ prefix, i.e., HTTP_USER_AGENT becomes REDIRECT_HTTP_USER_AGENT. REDIRECT_URL, REDIRECT_STATUS, and REDIRECT_QUERY_STRING are guaranteed to be set, and the other headers will be set only if they existed prior to the error condition. None of these will be set if the ErrorDocument target is an external redirect (anything starting with a scheme name like http:, even if it refers to the same host as the server). Customizing Error Responses Własna odpowiedź na błąd RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond - określa warunek pod którym przepisanie będzie miało miejsce. % - określa chyba zmienną server'a. ENV - prefix mówiący o możliwości występowania po nim zmiennej środowiskowej. Mogą występować zwykłe zmienne jak i środowiskowe. REDIRECT_STATUS - zmienna środowiskowa, ponieważ zaczyna się od prefix'u REDIRECT_. ^$ - nakazuje łańcuchowi znaków (string), aby zaczynał się od pustego string'a i kończył na pustym string'u. Jeśli chodzi o różnicę między "^$", a "", to jest i to znaczna. Pierwszy wzorzec łapie wszystko, co zaczyna się od pustego string'a i kończy na pustym string'u, czyli nie wyłapie np. tego: " ", natomiast drugi wzorzec wyłapie ten string jako prawidłowy (ten którego chcieliśmy wyłapać). Dla zwizualuowania/zwizualizowania:
W celu uzyskania pełnej lokalnej ścieżki systemu plików z żądania w kontekście per-server, użyj na podstawie look-ahead %{LA-U:REQUEST_FILENAME} do ustalenia końcowej wartości (razem) z REQUEST_FILENAME. O ile dobrze zrozumiałem, to jeśli chcesz ze zwykłej zmiennej zrobić zmienną środowiskową to musisz dodać prefix REDIRECT_ i obok niego dopisać zwykłą zmienną np. STATUS i wychodzi wtedy zmienna środowiskowa REDIRECT_STATUS. Wyjątkiem od tej reguły jest chyba tylko to: %{ENV:variable}, choć nie jestem tego pewien, musiałbyś doczytać. https://httpd.apache.org/docs/2.4/env.html URL Rewriting The %{ENV:variable} form of TestString in the RewriteCond allows mod_rewrite's rewrite engine to make decisions conditional on environment variables. Note that the variables accessible in mod_rewrite without the ENV: prefix are not actually environment variables. Rather, they are variables special to mod_rewrite which cannot be accessed from other modules. Co do Twojego problemu to ... Jeśli zmienna środowiskowa REDIRECT_STATUS będzie pusta to wykonuj/nie wykonuj przekierowywania. Oznacza to tyle, to co podałem w przykładzie powyżej. Zatem linijka/linia o którą pytasz jest napisana tak, aby nie było zbędnych przekierowań. Reasumując, jeśli we wzorcu (pattern) jest ^$, to wtedy string dla którego nastąpi przekierowywanie jest pusty absolutnie pusty, bezwzględnie (ale to tylko umowa). Jeśli w string'u znajdzie się conajmniej jeden znak (character), to nie nastąpi przekierowywanie, czy przepisanie string'a na inny adres, czy coś w tym stylu. https://httpd.apache.org/docs/2.4/mod/mod_r...tml#rewritecond : Cytat The RewriteCond directive defines a rule condition. One or more RewriteCond can precede a RewriteRule directive. The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met. TestString is a string which can contain the following expanded constructs in addition to plain text: Dyrektywa RewriteCond określa warunek reguły. Jeden lub więcej RewriteCond może poprzedzać dyrektywę RewriteRule. Poniższa reguła jest wówczas tylko użyta jeśli zarówno bieżący stan z URI pasują wzorem, i jeśli te warunki są spełnione. Cytat w jaki sposób ta linijka: ...* Powoduję "naprawę" tego błędu. Mi się wydaje, że dzieje się tak dlatego, że nie masz regex'ów odpowiednich w RewriteCond. Spróbuj może tak: Kod RewriteCond %{REQUEST_FILENAME} ^$ !-d RewriteCond %(REQUEST_FILENAME) ^$ !-f RewriteCond %(REQUEST_FILENAME) ^$ !-l RewriteRule ^(.+)$ /1/public/index.php?url=$1 [QSA,L] Chodzi oto, że ta jedna linia o którą pytasz powoduje brak przekierowania wszystkich URI chyba. Dlatego więc zamiast w kilku miejscach pisać ... ^$ ..., można machnąć to w jednej linii i nie dopisywać tego w kolejnych, tak mi się wydaje. Wracając do sedna, masz najprawdopodobniej nieskończoną pętlę przekierowań i wtedy uruchamiane jest zabezpieczenie, które temu zapobiega. Nie możesz mieć nieskończonej pętli chyba, więc musisz dodać warunek, który zakończy n'te przekierowanie i "wyjdzie" ze skryptu/pliku/pętli. Cytat LimitInternalRecursion prevents the server from crashing when entering an infinite loop of internal redirects or subrequests. Such loops are usually caused by misconfigurations. Resztę sam doczytaj (w dokumentacji). LimitInternalRecursion Directive Description: Determine maximum number of internal redirects and nested subrequests Syntax: LimitInternalRecursion number [number] Default: LimitInternalRecursion 10 Context: server config, virtual host LimitInternalRecursion Directive Masz ponad 10 cykli czegoś tam i wyrzuca Ci błąd, jeśli chcesz aby nie wyrzucało Ci błędu, a nie masz pętli nieskończonej to możesz to przestawić na np. 15 cykli, jeśli się na tyle da ustawić. Spróbuj napisać te trzy linie w jednej, np. tak: Kod RewriteCond %(REQUEST_FILENAME) ^$ !-d !-f !-l REDIRECT_URL, REDIRECT_STATUS, and REDIRECT_QUERY_STRING są gwarantowane do ustawienia, i inne nagłówki zostaną ustawione tylko jeśli istniały wcześniej do warunku błędu. Musiałbyś przeczytać dokumentację potrzebnych ci rzeczy od deski do deski, aby załapać o co chodzi z tymi nieskończonymi przekierowaniami. W czym masz opakowany ten kod w: Kod <IfModule mod_rewrite.c> # ... </IfModule> Czy w czymś innym? Czy zmieniałeś może plik httpd.conf, czy jakikolwiek inny odpowiedzialny za te przekierowania, jeśli tak to podaj te zmiany. Moje tłumaczenie oraz translate google trochę. https://httpd.apache.org/docs/2.4/expr.html#vars https://httpd.apache.org/docs/2.4/rewrite/intro.html#regex https://httpd.apache.org/docs/2.4/custom-error.html https://httpd.apache.org/docs/2.4/mod/mod_l....html#customlog https://httpd.apache.org/docs/2.4/mod/mod_status.html https://httpd.apache.org/docs/2.4/rewrite/flags.html https://wiki.apache.org/httpd/RewriteCond https://www.w3.org/International/questions/...taccess-charset https://httpd.apache.org/docs/2.4/mod/quickreference.html https://httpd.apache.org/docs/current/mod/core.html#ifmodule https://httpd.apache.org/docs/2.4/mod/quickreference.html ...* - ominięcie tekstu Ten post edytował Neutral 5.07.2018, 19:18:46 |
|
|
5.07.2018, 16:41:58
Post
#3
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 4.07.2018 Ostrzeżenie: (0%) |
Napisałeś się, pomogłeś ale ostatecznie to w sumie dalej nie dostałem odpowiedzi na nurtujące mnie pytanie, z czego wynikają te zapętlenia?
Bo rozumiem teraz, tak jak napisałeś, że sprawdzam czy zmienna środowiskowa REDIRECT_STATUS pasuję do wzorca (^$) czyli jest po prostu pusta. (czyli nie ma żadnych przekierowań i dopiero wtedy dopuszcza do przekierowania) Z drugiej strony to jakie przekierowania mogą być w tym samym momencie, po co sprawdzać coś co i tak powinno nie występować skoro tego nie rozpocząłem? Znalazłem książkę dla administratorów odnośnie Mod_rewrite (Mod_rewrite. Podręcznik administratora Rich Bowen ) może z tego uda się coś wyczytać. Ktoś nazwał Mod_rewrite - Vodoo, zgadzam się w 100%.. dokumentacja jest, ale co z tego skoro nie idzie się z niej doczytać odnośnie tych przekierowań..albo jest to masakrycznie trudne :/ Ale i tak dziękuje, za mega długą i rzeczową odpowiedź. Oczywiście kliknę "POMÓGŁ". Ten post edytował FuriousMatthew 5.07.2018, 16:42:43 |
|
|
Wersja Lo-Fi | Aktualny czas: 29.03.2024 - 12:34 |