Статьи

PHP и стандарты: arg_separator.output

Директива конфигурации PHP arg_separator.output позволяет вам сообщить PHP, как он должен разделять аргументы в URL, и имеет значение по умолчанию ‘&’.

Директива влияет на все URL-адреса, которые автоматически генерируются или изменяются PHP. Единственный раз, когда это может повлиять на нас, это когда мы используем PHP Session Handling вместе с session.use-trans-sid для автоматической генерации URL с идентификаторами сеансов. Так что, если вы не используете это, следующая проблема может не повлиять на вас.

Теоретически, если ваше веб-приложение предпочитает разделять аргументы в URL другим символом, таким как ‘;’, вы можете указать PHP использовать этот символ вместо:


http://www.example.com/url?variable1=value1;variable2=value2

Однако следующее примечание в разделе « Обработка сеансов» руководства по PHP указывает на проблему.

Примечание: директива arg_separator.output php.ini позволяет настроить разделитель аргументов. Для полного соответствия XHTML, укажите & там.

Это кажется очень странным. Во-первых, проблема не имеет ничего общего с соответствием XHTML. Быстрый взгляд на спецификацию HTML 4.01, спецификацию HTML 3.2 или даже это Введение в SGML, на котором основан HTML, должен напомнить вам, что все вхождения ‘&’ должны быть исключены (например, с &), независимо от версии HTML или XHTML в использовании. Я считаю, что миф о том, что это проблема только XHTML, может быть связан с тем фактом, что проверка одной разметки стала модной примерно в то же время, что и использование XHTML.

Во-вторых, описание, данное в директиве arg_separator.output, приведенной в руководстве по PHP, указывает, что разделитель будет использоваться в URL:

arg_separator.output строка Разделитель, используемый в сгенерированных PHP URL-адресах для разделения аргументов.

В PHP скрыто различие между URL-адресом и URL-адресом, представленным в значении атрибута HTML. Во втором случае небольшая выборка символов (& и ‘или “) должна быть экранирована. Мы должны иметь возможность установить arg_separator.output в ‘&’, и PHP должен избегать этого соответствующим образом всякий раз, когда он использует его в качестве значения атрибута в HTML (или XHTML, в этом отношении).

Конечно, при использовании значения ‘&’ PHP ошибочно превращает ваши ссылки в нечто вроде:


Tony

Это стандартное поведение PHP, и оно некорректно во всех версиях HTML и XHTML.

Комментарий в PHP демонстрирует путаницу, которую это вызвало:

Значение arg_separator.output, равное «&», плохое, если вы хотите работать с xhtml. Xhtml требует & вместо того, чтобы быть выписанным. Это, например, предотвращает проверку xhtml с помощью php-сессий. Я надеюсь, что значение по умолчанию будет изменено

Подразумеваемая разница между XHTML и HTML здесь неверна. Требование экранирования амперсандов в значениях атрибутов в равной степени распространяется на HTML (на основе SGML) и XHTML (на основе XML). Кроме того, предлагаемое решение исправить это, установив значение по умолчанию ‘&’, не элегантно. В идеале это значение должно быть «&», и PHP должен понимать, что когда он имеет дело со значениями атрибута, он должен преобразовать «&» в себя.

Если вы используете обработку сессий PHP и session.use_trans_sid для автоматической генерации URL-адресов с идентификаторами сессий, сейчас вы можете установить arg_separator.output в ‘&’ в вашей конфигурации PHP, чтобы оставаться хорошо сформированным в HTML или XHTML.

Лахлан указал мне, что изменение этого значения также повлияет на http_build_query , который используется для генерации необработанных URL, которые не должны содержать HTML-сущности. Поэтому, если вы установите arg_separator.output в ‘&’, чтобы обойти эту проблему, избегайте использования http_build_query и наоборот.

Наиболее элегантным решением было бы вставить свои собственные идентификаторы сеансов в URL-адреса и полностью избегать session.use_trans_sid, поскольку session.use_trans_sid – это voodoo