Правильный способ кодирования (относительного) URL с помощью PHP

#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.