Если URL содержит цитату, как вы указываете значение rel = canonical? - PullRequest
4 голосов
/ 10 октября 2009

Скажите, что путь вашего URL:

/thisisa"quote/helloworld/

Тогда как создать URL-адрес rel=canonical?

Это кошерный?

<link rel="canonical" href="/thisisa&amp;quot;/helloworld/" />

UPDATE

Чтобы уточнить, я получаю отправку формы, мне нужно преобразовать часть строки запроса в URL. Итак, шаги:

  1. .htaccess выполняет перенаправление
  2. PHP обрабатывает каталог как строку запроса.
  3. Строка запроса будет динамически вставлена ​​в:
    • Название
    • Описание
    • Ключевые слова
    • Канонический URL.
    • Плевать обратно в поле ввода формы

Так что мне нужно знать, какую обработку нужно выполнять на каждом этапе пути ... На первом отрезке это мой дубль:

  • Название: htmlspecialchars($rawQuery)
  • Описание: htmlspecialchars($rawQery)
  • Ключевые слова: htmlspecialchars($rawQuery)
  • Канонический URL: это сложная часть. Он должен совпадать с тем же URL-адресом, на который перенаправляется .htaccess , но, несмотря на это, я думаю, что необработанный запрос небезопасен, поскольку кавычки могут вызвать внедрение JavaScript. Беспокоитесь о urlencode($rawquery), так как оно приходит с URL, не будет ли оно уже закодировано в URL?
  • плюнь обратно в форму: htmlspecialchars($rawQuery)

Ответы [ 5 ]

7 голосов
/ 12 октября 2009

Вы должны разделить свой вопрос на две части:

Нужно ли кодировать символ двойной кавычки в пути URL?

Да, символ кавычки (U + 0022) недопустим простым текстом и должен кодироваться с помощью %22.

Нужно ли кодировать символ двойной кавычки в значение атрибута HTML?

Это зависит от , как вы объявляете значение атрибута :

По умолчанию SGML требует, чтобы все значения атрибутов были разделены с помощью двойных кавычек (десятичный ASCII 34) или одинарных кавычек (десятичный ASCII 39). Одинарные кавычки могут быть включены в значение атрибута, когда значение ограничено двойными кавычками, и наоборот. Авторы также могут использовать числовые ссылки на символы для представления двойных кавычек (&#34;) и одинарных кавычек (&#39;). Для двойных кавычек авторы также могут использовать ссылку на символьную сущность &quot;.

  • Если вы используете символ двойной кавычки для объявления значения атрибута (attr="value"), затем необходимо закодировать символ кавычки Дувка в объявлении значения атрибута с помощью ссылки на символ (&quot;, &#34; или &#x22;).
  • Если вы используете символ одинарной кавычки (U + 0027) для объявления значения атрибута (attr='value'), тогда вам не нужно кодировать символ кавычки. Но это рекомендуется делать.

И поскольку в значении вашего атрибута есть косая черта и двойная кавычка, третий случай (вообще без кавычек) неприменим:

В некоторых случаях авторы могут указывать значение атрибута без кавычек. Значение атрибута может содержать только буквы (a-z и A-Z), цифры (0-9), дефисы (десятичное число ASCII 45), точки (десятичное число ASCII 46), подчеркивания (десятичное число ASCII 95) и двоеточия (десятичное число ASCII 58). Мы рекомендуем использовать кавычки, даже если их можно устранить.

Теперь объединяем оба ответа

Поскольку двойная кавычка должна быть закодирована в URL (, но одиночная кавычка -! ), вы можете использовать следующее для сегментов пути или пути URL:

$path = '/thisisa"quote/helloworld/';
$path = implode('/', array_map('rawurlencode', explode('/', $path)));

И если вы хотите поместить этот URL-путь в атрибут HTML, используйте функцию htmlspecialchars для кодирования оставшихся специальных символов HTML:

echo '<link rel="canonical" href="' . htmlspecialchars($path) . '" />';
6 голосов
/ 10 октября 2009

Использовать экранирование URL, в данном случае% 22 * ​​1001 *

http://everything2.com/title/URL+escape+sequences

1 голос
/ 12 октября 2009

Если URL-адрес содержит двойные кавычки, то он должен содержать одинарные кавычки.

<link rel="canonical" href='foo.com/thisisa"/helloworld/' />

Не используйте кодировку HTML в строках URI. Это неверный синтаксис, поскольку амперсанд должен быть закодирован в URI, поскольку это специальный символ функции. Вместо этого всегда используйте процентное кодирование для URI.

1 голос
/ 10 октября 2009

Цитата даже не является действительным символом URL, поэтому я думаю, что в долгосрочной перспективе вы должны решить эту проблему. Он специально исключен из синтаксиса URI RFC 2396 .

Чтобы решить непосредственную проблему, вам нужно убежать от персонажа, используя %22.

0 голосов
/ 10 октября 2009

Я бы сказал, что вы хотите использовать значение HEX для цитаты, равной %22.

Прочтите это, чтобы узнать больше о Кодировке URL .

...