Кажется, что значения POST теряются при использовании .htaccess RewriteRule. Значения GET в порядке. Как исправить?

Несколько дней назад у меня возник вопрос об удалении index.php из адресной строки, поэтому адрес страницы выглядит короче и лучше. Самое короткое решение этой проблемы: ( RewriteRule ^ index.php / [L, R = 301] в файле .htaccess ). И это работает!

Поскольку я помещаю эту строку в .htaccess, некоторые страницы перенаправляются на главную страницу. Почему? Насколько я понимаю, ответ RewriteRule ^index.php / [L,R=301] : с RewriteRule ^index.php / [L,R=301] , параметры $ _POST не отправляются на следующую страницу. Параметры $ _GET в порядке. Как только я удалю RewriteRule ^index.php / [L,R=301] из .htaccess, все станет нормально, как обычно. Почему это происходит и как это исправить?

Спасибо.

Флаг [R] перенесет перенаправление. А пользователь-агенты выдают перенаправление как GET . Ничто не может быть сделано, если вы действительно хотите сократить URL-адреса до пути / root.

Тем не менее, вы можете блокировать запросы POST от перезаписи / перенаправления:

 RewriteCond %{REQUEST_METHOD} !POST RewriteRule ^index.php / [L,R=301] 

Вместо этого вы можете попробовать использовать [L,R=307] . 307 не должны изменять метод запроса в соответствии со спецификацией, но я не знаю, как браузер реализовал 307.

Но корень проблемы заключается в использовании <form action="____/index.php" ...

Просто оставьте действие пустым для POST для текущего URL, например

Я использую что-то вроде:

 <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), проверьте этот вопрос: возможно ли перенаправить почтовые данные?

Значения POST НИКОГДА не переживут внешнего перенаправления ( R=301 ), это ответственность за безопасность, поэтому браузеры никогда не поддержат это. Удалите R=301 и все будет в порядке. Вам просто нужно изменить все существующие ссылки на страницу на более короткие / красивые ( <a> , но также и на действия и т. Д.),

У меня были те же проблемы, но мои htacces были такими:

 RewriteEngine on RewriteRule .* index.php [NC] 

Просто измените NC на L, и все работает нормально.

Итоговый код:

 RewriteEngine on RewriteRule .* index.php [L]