#php #javascript #apache #urlencode #url-encoding
#php #javascript #апач #urlencode #url-кодировка #apache #url-кодирование
Вопрос:
Я пытаюсь закодировать следующий относительный URL с помощью PHP:
/tracks/add/5449326
Я пробовал использовать rawurlencode и urlencode.
Что сделало его похожим на: /tracks/add/5449326
Я собираюсь использовать этот URL в вызове AJAX.
URL, к которому я пытаюсь выполнить вызов, является:
/overlay/add-track/{param1}/{param2}
{param1} — это просто некоторый идентификатор
{param2} — это закодированный URL
Однако, когда я пытаюсь выполнить вызов, я получаю 404.
Судя по всему, он пытается вызвать:
/overlay/add-track/1//tracks/add/5449326
Похоже, что он пытается получить доступ к декодированной строке.
Есть идеи, как это исправить?
PHP
$url = rawurlencode('/tracks/add/5449326');
echo '<a href="/overlay/add-track/1/'.$url.'">Add</a>';
JS (jQuery)
var href = $(‘a’).attr(‘href’);
$.ajax({
url: href,
type: 'POST',
data: {},
dataType: "json",
success: function(data)
{
// do stuff
}
});
Редактировать
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} .(eps|js|ico|gif|jpg|png|css|jpeg|doc|xls|doc|pdf|txt|ppt|zip)$
RewriteRule ^(.*)$ $1 [L]
RewriteCond "/path/public/%{REQUEST_URI}" !-f
RewriteRule ^(.*)$ /index.php/$1 [L]
Комментарии:
1. Разве вы не можете просто использовать GET переменную для {param2}? Нравится
/overlay/add-track/{param1}?param2={param2}
2. Что произойдет, если вы введете
/overlay/add-track/1//tracks/add/5449326
в адресную строку? Конечно, с добавлением информации о домене.3. Должно сработать, в вашем журнале доступа явно указан неправильный URL?
4. как насчет кодирования base64 и декодирования параметра url?
5. @Znarkus: Я получаю 404. Однако, если я изменю кодирование косых черт на другой символ, например, и
x
это сработает.
Ответ №1:
Вероятно, веб-сервер не разрешает кодированную косую черту, что приводит к значению по умолчанию 404.
Для apache смотрите:
http://httpd.apache.org/docs/current/mod/core.html#allowencodedslashes
Либо необходимо изменить конфигурацию apache, либо вам нужно обойти это, заменив косую черту на что-то другое.
редактировать: Вы могли бы попробовать двойной urlencode, а затем decodeURI() в javascript.