Кажется, что значения POST теряются при использовании .htaccess RewriteRule. Значения GET в порядке. Как исправить?
Несколько дней назад у меня возник вопрос об удалении index.php из адресной строки, поэтому адрес страницы выглядит короче и лучше. Самое короткое решение этой проблемы было (RewriteRule ^ index.php/[L, R = 301] в файле .htaccess). И это работает!
Поскольку я помещаю эту строку в .htaccess, некоторые страницы перенаправляются на главную страницу. Почему? Насколько я понимаю, ответ таков: с параметрами RewriteRule ^index.php / [L,R=301]
, $_POST не отправляются на следующую страницу. Параметры $_GET в порядке.
Как только я удалю RewriteRule ^index.php / [L,R=301]
из .htaccess, все станет нормально, как обычно.
Почему это происходит и как это исправить?
Спасибо.
Ответы
Ответ 1
Флаг [R]
перенесет перенаправление. А пользователь-агенты выдают перенаправление как запрос GET
. Нет ничего, что можно было бы сделать, если вы действительно хотите сократить URL-адреса до корневого пути /
.
Тем не менее, вы можете блокировать запросы POST от перезаписи/перенаправления:
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule ^index.php / [L,R=301]
Ответ 2
Вместо этого вы можете использовать [L,R=307]
. 307 не должен изменять метод запроса в соответствии со спецификацией, но я не знаю, как браузер реализовал 307.
Но корень проблемы заключается в использовании <form action="____/index.php" ...
Просто оставьте действие пустым для POST в текущем URL, например.
Ответ 3
Я использую что-то вроде:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/(css|images|js)/
# don't rewrite existing files, directories and links
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
# rewrite everything else to index.php
RewriteRule .* index.php [L]
</IfModule>
И его работа для всех запросов, переписывая его через файл index.php.
Если вам нужно переадресовать 301 (что означает код Moved Permanentently), проверьте этот вопрос: Возможно ли перенаправить почтовые данные?
Ответ 4
Значения POST НИКОГДА не выживут при внешнем перенаправлении (R=301
), это ответственность за безопасность, поэтому браузеры никогда не будут поддерживать это. Удалите R=301
, и все будет в порядке. Вам просто нужно изменить все существующие ссылки на страницу на более короткую/более красивую (<a>
, но также создавать действия и т.д.).
Ответ 5
У меня были те же проблемы, но мои htacces были такими:
RewriteEngine on
RewriteRule .* index.php [NC]
Просто измените NC на L, и все будет хорошо.
Конечный код:
RewriteEngine on
RewriteRule .* index.php [L]
Ответ 6
В моем случае я использовал .htaccess. Ссылка: PHP $ _POST не работает?
т.е. action = "booking.php" to action = "booking" работал для меня