Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][Access]MOD_REWRITE - .htaccess - Problem z RewriteCond %{ENV:REDIRECT_STATUS} ^$, Zapętlanie przekierowania i błąd AH00124
FuriousMatthew
post 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.
Go to the top of the page
+Quote Post
Neutral
post 4.07.2018, 20:16:14
Post #2





Grupa: Zarejestrowani
Postów: 187
Pomógł: 26
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:

  1. <?php
  2. var_dump(preg_match('@^gooseberry$@','parsley gooseberry lettuce'));
  3. // int(0)
  4. var_dump(preg_match('@gooseberry@','parsley gooseberry lettuce'));
  5. // int(1)
  6. var_dump(preg_match('@^gooseberry$@','gooseberry'));
  7. // int(1)
  8. var_dump(preg_match('@gooseberry$@','parsley gooseberry'));
  9. // int(1)
  10. var_dump(preg_match('@^gooseberry@','gooseberry lettuce'));
  11. // int(1)
  12. var_dump(preg_match('@^gooseberry@','parsley gooseberry lettuce'));
  13. // int(0)
  14.  
  15. // int(0) - niezgodne ze wzorcem
  16. // int(1) - zgodne ze wzorcem
  17. ?>


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
Go to the top of the page
+Quote Post
FuriousMatthew
post 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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.10.2018 - 18:31