Директива конфигурации 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 ошибочно превращает ваши ссылки в нечто вроде:
Это стандартное поведение 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