На моем сайте я использую htaccess url rewriting для полного удаления php-расширений из php-файлов.
Расширение Php полностью удаляется, /file.php отображает / файл.
Моя проблема в том, что php-формы с методом POST перестают работать при удалении правила php.
Я использую :
action="<?php echo $_SERVER["PHP_SELF"]?>"
в действии атрибута форм.
Я уверен, что это не проблема, связанная с htaccess или браузером, потому что мое регулярное выражение htaccess сопоставляется с обоими методами GET | POST. и я использую 302 для перенаправления.
Моя форма url is /signup.php. Она меняет / signup при вводе /signup.php. Нужно ли мне заменять PHP_SELF атрибутом action / signup?
Вы должны использовать $_SERVER["REQUEST_URI"]
а не $_SERVER["PHP_SELF"]
.
По документации PHP (выделение мое):
$_SERVER['PHP_SELF']
Имя исполняемого скрипта, относящегося к корню документа.
тогда как $_SERVER['REQUEST_URI']
URI, который был предоставлен для доступа к этой странице; например, '/index.html'.
Поскольку вы переписываете свои URL-адреса для удаления расширения .php, вы больше не должны ссылаться на имя файла сценария, которое содержит расширение, а скорее на URI текущей страницы.
Из-за правил HTTP / 1.1 данные POST не могут переноситься через перенаправления. Хотя есть код перенаправления (307), который должен переносить данные POST через перенаправление, не все серверы будут поддерживать его из-за потенциальных уязвимостей безопасности.
Также обратите внимание, что как 302, так и 307 объявлены как «временные» перенаправления, что означает, что в какой-то момент в будущем этого не будет, поскольку такой заголовок управления кешем должен быть отправлен, указывая, когда он должен проверить, было ли оно изменено. Тип перенаправления, который вы делаете здесь, больше напоминает постоянное изменение, и в этом случае нужно отправить 301. http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Все проблемы с перенаправлением в стороне, обычно это плохая форма (каламбур) для подачи формы, чтобы нанести какой-либо переадресации, так как она появляется «фиши». Вы должны либо отправить непосредственно на указанную страницу: <?=$_SERVER['REQUEST_URI']; ?>
<?=$_SERVER['REQUEST_URI']; ?>
или просто не предоставлять атрибут действия. Начиная с HTML 5.0 атрибут действия не требуется http://www.w3schools.com/tags/att_form_action.asp . Если вы хотите следовать стандартам HTML 4.0, action=""
также работает таким же образом и корректно соответствует спецификациям (поскольку действие является относительным URL-адресом, пустой путь означает «здесь»).