urlencoded Forward slash is breaking URL

O systemie

Mam adresy URL tego formatu w moim projekcie:-

http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0

Gdzie para słów kluczowych / klas oznacza Wyszukiwanie ze słowem kluczowym "class".

Mam wspólny indeks.plik php, który wykonuje dla każdego modułu w projekcie. Istnieje tylko reguła przepisywania, aby usunąć indeks.php z URL: -

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

Używam urlencode() podczas przygotowywania adresu URL wyszukiwania i urldecode () podczas czytania adresu URL wyszukiwania.

Problem

Tylko forward znak ukośnika łamie adresy URL, powodując błąd 404 page not found. Na przykład, jeśli przeszukam one/two URL to

http://project_name/browse_by_exam/type/tutor_search/keyword/one%2Ftwo/new_search/1/search_exam/0/search_subject/0/page_sort/
Jak to naprawić? Muszę zachować indeks.php ukryte w adresie URL. W przeciwnym razie, gdyby to nie było potrzebne, nie byłoby problemu z ukośnikiem do przodu i mógłbym użyć tego adresu URL: -
http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one
%2Ftwo/new_search/1/search_exam/0/search_subject/0
Author: Captain Man, 2010-07-13

12 answers

Apache odrzuca wszystkie adresy URL z %2F w części ścieżki, ze względów bezpieczeństwa: skrypty nie mogą normalnie (np. bez przepisywania) odróżnia %2F od {[2] } ze względu na to, że zmienna środowiskowa PATH_INFO jest automatycznie dekodowana URL (co jest głupie, ale dawna część specyfikacji CGI, więc nic nie można z tym zrobić).

Możesz wyłączyć tę funkcję za pomocą AllowEncodedSlashes dyrektywy, ale zauważ, że Inne Serwery WWW nadal będą jej odmawiać (bez możliwość wyłączenia), a także inne znaki mogą być tabu (np. %5C), a to %00 w szczególności będzie zawsze blokowane zarówno przez Apache, jak i IIS. Jeśli więc Twoja aplikacja polegała na tym, że może mieć %2F lub inne znaki w części ścieżki, ograniczysz Opcje zgodności/wdrożenia.

Używam urlencode () podczas przygotowywania wyszukiwanego adresu URL

Powinieneś użyć rawurlencode(), Nie urlencode() dla fragmentów ścieżki ucieczki. urlencode() jest błędnie nazywany, jest w rzeczywistości dla danych application/x-www-form-urlencoded, takich jak łańcuch zapytania lub treść żądania POST, a nie dla innych części adresu URL.

Różnica polega na tym, że + nie oznacza przestrzeni w częściach ścieżki. Zamiast tego rawurlencode() poprawnie wygeneruje %20, które będą działać zarówno w danych zakodowanych w formie, jak i w innych częściach adresu URL.

 130
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-13 08:26:24

W Apache, AllowEncodedSlashes On uniemożliwia natychmiastowe odrzucenie żądania za pomocą 404.

Kolejny pomysł jak to naprawić.

 4
Author: Paul Jennings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-28 09:27:52

Zamień %2F na % 252F po kodowaniu url

PHP

function custom_http_build_query($query=array()){

    return str_replace('%2F','%252F', http_build_query($query));
}

Obsługa żądania poprzez htaccess

.htaccess

RewriteCond %{REQUEST_URI} ^(.*?)(%252F)(.*?)$ [NC]
RewriteRule . %1/%3 [R=301,L,NE]

Zasoby

Http://www.leakon.com/archives/865

 3
Author: RafaSashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 11:32:26
$encoded_url = str_replace('%2F', '/', urlencode($url));
 3
Author: CpnCrunch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 10:41:39

Miałem ten sam problem z ukośnikiem w url get param, w moim przypadku działa następujący kod php:

$value = "hello/world"
$value = str_replace('/', '/', $value;?>
$value = urlencode($value);?>
# $value is now hello%26%2347%3Bworld

Najpierw zamieniam ukośnik na encję html, a następnie koduję url.

 3
Author: Christian Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-03 17:46:44

Na moim koncie hostingowym ten problem był spowodowany przez regułę ModSecurity, która została ustawiona automatycznie dla wszystkich kont. Po moim zgłoszeniu tego problemu ich administrator szybko usunął tę regułę dla mojego konta.

 2
Author: Roman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-17 18:03:37

Użyj innego znaku i zastąp stronę serwera slashes

Np. Drupal.org używa %21 (znak excalamation!) do reprezentowania ukośnika w parametrze url.

Oba poniższe linki działają:

Https://api.drupal.org/api/drupal/includes%21common.inc/7

Https://api.drupal.org/api/drupal/includes! common. inc/7

Jeśli obawiasz się, że znak może kolidować ze znakiem w parametrze, użyj kombinacji postaci.

Więc Twój url byłby http://project_name/browse_by_exam/type/tutor_search/keyword/one_-!two / new_search / 1 / search_exam/0 / search_subject/0

Zmień go za pomocą js i przekonwertuj go z powrotem na stronę serwera slash.

 1
Author: chim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-02 15:49:45

Standardowym rozwiązaniem tego problemu jest umożliwienie ukośników poprzez uczynienie parametru, który może zawierać ukośniki, ostatnim parametrem w adresie url.

Dla adresu URL kodu produktu, który będziesz miał...

mysite.com/product/details/PR12345/22

Dla szukanego terminu masz

http://project/search_exam/0/search_subject/0/keyword/Psychology/Management

(tutaj słowem kluczowym jest psychologia / Zarządzanie)

Przetworzenie pierwszych "nazwanych" parametrów, a następnie powiązanie pozostałych z kodem produktu lub słowem kluczowym, nie jest ogromną ilością pracy.

Niektóre frameworki mają to obiekt wbudowany w ich definicje routingu.

Nie dotyczy to przypadków użycia z dwoma parametrami, które zawierają ukośniki.

 0
Author: chim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-07 11:51:20

Jest dla mnie proste użycie base64_encode

$term = base64_encode($term) 
$url = $youurl.'?term='.$term

Po zdekodowaniu terminu

$term = base64_decode($['GET']['term'])

W ten sposób Zakoduj " / "i" \ "

 0
Author: Yannick William Nchoutmboube,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 16:33:39

Używam funkcji javascript encodeURI() dla części URL, która ma ukośniki do przodu, które powinny być postrzegane jako znaki zamiast adresu http. Eg:

"/api/activites/" + encodeURI("?categorie=assemblage&nom=Manipulation/Finition")

Zobacz http://www.w3schools.com/tags/ref_urlencode.asp

 -1
Author: Eva M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 17:21:35

Rozwiązałem to za pomocą 2 niestandardowych funkcji jak tak:

function slash_replace($query){

    return str_replace('/','_', $query);
}

function slash_unreplace($query){

    return str_replace('_','/', $query);
}

Więc do kodowania mogę zadzwonić:

rawurlencode(slash_replace($param))

I do dekodowania mogę zadzwonić

slash_unreplace(rawurldecode($param);
Zdrówko!
 -1
Author: Lon Ilesanmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-02 21:13:35

Możesz użyć %2F jeśli używasz go w ten sposób:
?param1=value1&param2=value%2Fvalue

Ale jeśli użyjesz {[2] } spowoduje to błąd.

 -3
Author: Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 10:43:36