Похоже, значения POST теряются при использовании .htaccess RewriteRule.GET значения в порядке.Как исправить? - PullRequest
12 голосов
/ 12 января 2012

Несколько дней назад у меня возник вопрос об удалении 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, все становится нормально, как обычно.Почему это происходит и как это исправить?

Спасибо.

Ответы [ 6 ]

18 голосов
/ 12 января 2012

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

Однако вы можете заблокировать POST-запросы специально от переписывания / перенаправления:

RewriteCond %{REQUEST_METHOD} !POST
RewriteRule ^index.php / [L,R=301]
11 голосов
/ 12 января 2012

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

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

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

5 голосов
/ 12 января 2012

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

<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 (что означает «Перемещенный постоянный код»), проверьте этот вопрос: Можно ли перенаправить данные публикации?

4 голосов
/ 12 января 2012

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

1 голос
/ 11 ноября 2017

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

RewriteEngine on
RewriteRule .* index.php [NC]

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

RewriteEngine on
RewriteRule .* index.php [L]
0 голосов
/ 01 мая 2019

В моем случае я использовал .htaccess.См .: PHP $ _POST не работает?

т.е. действие = "booking.php" к действию = "бронирование" сработало для меня

...