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 ответов:
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]
ресурсы
У меня была такая же проблема с косой чертой в 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")
я решил это с помощью 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);
Ура!