urlencoded виде косой черты является нарушение URL-адрес


о системе

у меня есть URL этого формата в моем проекте: -

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

где пара ключевое слово / класс означает поиск с ключевым словом "класс".

у меня есть общий индекс.php файл, который выполняет для каждого модуля в проекте. Есть только правило перезаписи для удаления индекса.php из URL: -

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

я использую urlencode () при подготовке URL поиска и urldecode () при чтении поиска URL-АДРЕС.

только символ косой черты нарушает URL-адреса, вызывая ошибку 404 page not found. Например, если я ищу one/two URL-адрес

http://project_name/browse_by_exam/type/tutor_search/keyword/one%2Ftwo/new_search/1/search_exam/0/search_subject/0/page_sort/

как это исправить? Мне нужно сохранить индекс.php скрыт в URL. В противном случае, если бы это не было необходимо, не было бы никаких проблем с прямой косой чертой, и я мог бы использовать этот URL:-

http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one
%2Ftwo/new_search/1/search_exam/0/search_subject/0
12 65

12 ответов:

Apache отрицает все URL-адреса с %2F в путь частью по соображениям безопасности: скрипты не могут нормально (т. е. без переписывания) скажите разницу между %2F и / из-за PATH_INFO переменная окружения автоматически декодируется URL-адресом (что глупо, но давняя часть спецификации CGI, поэтому с этим ничего не поделаешь).

вы можете отключить эту функцию с помощью AllowEncodedSlashes директива, но обратите внимание, что другие веб-серверы по-прежнему будет запрещать его (без возможности отключить это), и что другие символы также могут быть табу (например. %5C), и %00 в частности, всегда будет заблокирован как Apache, так и IIS. Поэтому, если ваше приложение полагалось на возможность иметь %2F или другие символы в части пути, в которой вы ограничиваете параметры совместимости/развертывания.

я использую urlencode () при подготовке URL поиска

вы должны использовать rawurlencode(), а не urlencode() для экранирования части пути. urlencode() неправильно назван, это на самом деле для application/x-www-form-urlencoded данные, такие как строка запроса или тело запроса POST, а не для других частей URL-адреса.

разница в том, что + не означает пространство в частях пути. rawurlencode() правильно произвести %20 вместо этого, который будет работать как в виде закодированных данных, так и в других частях URL.

в Apache AllowEncodedSlashes On предотвратит немедленное отклонение запроса с помощью 404.

просто еще одна идея, как это исправить.

замените %2F на %252F после кодирования url

PHP

function custom_http_build_query($query=array()){

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

обрабатывать запрос через htaccess

.htaccess

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

ресурсы

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

$encoded_url = str_replace('%2F', '/', urlencode($url));

У меня была такая же проблема с косой чертой в url get param, в моем случае работает следующий php-код:

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

Я сначала заменяю косую черту на HTML-объект, а затем делаю кодировку url.

на моей учетной записи хостинга эта проблема была вызвана правилом ModSecurity, которое было установлено для всех учетных записей автоматически. После того, как я сообщил об этой проблеме, их администратор быстро удалил это правило для моей учетной записи.

используйте другой символ и замените косую черту на стороне сервера

например Drupal.org использует %21 (символ знака экскаламации !) для представления косой черты в параметре url.

обе ссылки, указанные ниже:

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

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

Если вы беспокоитесь, что персонаж может столкнуться с символ в параметре затем используйте комбинацию символов.

Так что Ваш url будет http://project_name/browse_by_exam/type/tutor_search/keyword/one_ -!два/new_search/1/search_exam/0/search_subject/0

измените его с помощью js и преобразуйте его обратно на серверную сторону косой черты.

для url-адреса кода продукта вы бы тогда имели...

mysite.com/product/details/PR12345/22

для поискового запроса у вас будет

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

(ключевое слово здесь психология/менеджмент)

это не огромный объем работы для обработки первых "именованных" параметров, а затем объединить остальные, чтобы быть кодом продукта или ключевое слово.

некоторые фреймворки имеют этот объект, встроенный в их определения маршрутизации.

это не применимо к варианту использования с двумя параметрами, которые содержат косые черты.

просто для меня использовать base64_encode

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

после того, как вы расшифровать термин

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

таким образом кодируют " / "и"\"

Я использую функцию javascript encodeURI () для части URL, которая имеет прямые косые черты, которые должны рассматриваться как символы вместо http-адреса. Например:

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

см.http://www.w3schools.com/tags/ref_urlencode.asp

я решил это с помощью 2 пользовательских функций, таких как:

function slash_replace($query){

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

function slash_unreplace($query){

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

Так что для кодирования я мог бы позвонить:

rawurlencode(slash_replace($param))

и для декодирования я мог бы позвонить

slash_unreplace(rawurldecode($param);

Ура!

можно использовать %2F Если использовать его таким образом:
?param1=value1&param2=value%2Fvalue

но если вы используете /param1=value1/param2=value%2Fvalue он выдаст ошибку.