Подтвердить что ты не робот

Формы с действием = ""

Я только узнал (трудный путь), что, когда у вас есть форма HTML с action="", браузеры Webkit относятся к нему по-разному с Firefox и Internet Explorer.

В FF и IE эти два тега формы эквивалентны:

<form method="post" action="">

<form method="post">

Они оба отправят форму обратно на ту же страницу. Safari и Chrome, однако, отправят эту первую форму на страницу по умолчанию (index.php или что-то еще) - вторая форма работает так же, как FF/IE.

Я быстро взломал свой код, чтобы везде, где он обычно печатал пустое действие, он вообще не добавляет атрибут действия.

Это кажется очень грязным, а не лучшим способом заниматься вещами. Может ли кто-нибудь предложить лучший метод? Кроме того, может ли кто-нибудь просветить меня о том, почему Webkit будет делать такую ​​вещь?

4b9b3361

Ответ 1

Я обычно использую

<form method='POST' action='?'>

Это означает текущий URL, но без параметров.

Ответ 2

Требуется атрибут action, но вы можете указать пустую ссылку URI, которая ссылается на текущий URI:

<form method="POST" action="">

Изменить Хорошо, это фактически зарегистрированная ошибка WebKit 528+ (см. Ошибка 19884), когда пустой URI используется с заданным базовым URI с использованием элемента BASE. В этом случае WebKit берет базовый URI вместо того, чтобы разрешать пустой URI из базового URI.

Но это правильное поведение в соответствии с RFC 3986:

5.1. Создание базового URI

Термин "относительный" означает, что существует "базовый URI", против которого применяется относительная ссылка. [...]

Базовый URI ссылки может быть установлен одним из четырех способов, обсуждается ниже в порядке приоритетности. Порядок приоритетности может следует рассматривать в терминах слоев, где самая внутренняя определенная база URI имеет наивысший приоритет. Это можно визуализировать графически следующим образом:

  .----------------------------------------------------------.
  |  .----------------------------------------------------.  |
  |  |  .----------------------------------------------.  |  |
  |  |  |  .----------------------------------------.  |  |  |
  |  |  |  |  .----------------------------------.  |  |  |  |
  |  |  |  |  |       <relative-reference>       |  |  |  |  |
  |  |  |  |  `----------------------------------'  |  |  |  |
  |  |  |  | (5.1.1) Base URI embedded in content   |  |  |  |
  |  |  |  `----------------------------------------'  |  |  |
  |  |  | (5.1.2) Base URI of the encapsulating entity |  |  |
  |  |  |         (message, representation, or none)   |  |  |
  |  |  `----------------------------------------------'  |  |
  |  | (5.1.3) URI used to retrieve the entity            |  |
  |  `----------------------------------------------------'  |
  | (5.1.4) Default Base URI (application-dependent)         |
  `----------------------------------------------------------'

В этом случае элемент BASE с атрибутом href является базовым URI, встроенным в контент. И базовый URI, встроенный в контент, имеет более высокий приоритет, чем URI, используемый для извлечения объекта. Таким образом, поведение WebKits на самом деле является ожидаемым поведением в соответствии с RFC 3986.

Но в HTML 5 это поведение пустого URI в form s action (все еще черновик) отличается от RFC 3986:

Если действие - это пустая строка, пусть действие будет адресом документа.

Примечание. Этот шаг является преднамеренным нарушением RFC 3986, для которого здесь требуется обработка базового URL. Это нарушение мотивируется стремлением к совместимости с наследием. [RFC3986]

Откровенно говоря, комментарий HTML после этой заметки в исходном коде читает:

<!-- Don't ask me why. But that what IE does. It even treats
action="" differently from action=" " or action="#" (the latter
two resolve to the base URL, the first one resolves to the doc
URL). And other browsers concur. It is even required, see e.g.
  http://bugs.webkit.org/show_bug.cgi?id=7763
  https://bugzilla.mozilla.org/show_bug.cgi?id=297761
-->

Так что это скорее ошибка, возникшая из Internet Explorer, которая стала стандартом де-факто.

Ответ 3

Лучшим способом, на мой взгляд, было бы не пропустить атрибут действия (который не будет проверять), а указать фактическое действие для формы. Есть ли причина, по которой вы не указали действие?

Ответ 4

Я всегда использовал (в PHP)

<form method="post" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?>">

Чтобы мои формы подчинялись себе.