使用.htaccess RewriteRule时,似乎POST值会丢失。 GET值没问题。怎么修?

时间:2012-01-11 21:25:06

标签: php .htaccess mod-rewrite post parameters

几天前,我有一个关于从地址栏中删除index.php的问题,因此页面的地址看起来越来越短。这个问题的最短解决方案是(RewriteRule ^index.php / [L,R=301] in the .htaccess file)。它有效!

由于我将该字符串放入.htaccess,因此某些页面会重定向到主页面。我花了很多时间猜测,为什么。据我了解,答案是:使用RewriteRule ^index.php / [L,R=301],$ _POST参数不会发送到下一页。 $ _GET参数没问题。 一旦我从.htaccess中删除RewriteRule ^index.php / [L,R=301],一切都会像往常一样变得很好。 为什么会发生这种情况以及如何解决这个问题?

谢谢。

6 个答案:

答案 0 :(得分:18)

[R]标志会产生重定向。用户代理发出重定向为GET请求。如果您真的想将网址缩短到/根路径,则无法执行任何操作。

然而,您可以阻止POST请求被重写/重定向:

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

答案 1 :(得分:11)

您可以尝试使用[L,R=307]代替。 307不得根据规范更改请求方法,但我不知道浏览器如何实现307。

但问题的根源是使用<form action="____/index.php" ...

将操作留空以POST到当前网址,例如

答案 2 :(得分:5)

我正在使用类似的东西:

<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 Permanently代码),请查看以下问题:Is it possible to redirect post data?

答案 3 :(得分:4)

POST值永远不会在外部重定向(R=301)中存在,这是一种安全责任,因此浏览器永远不会支持它。删除R=301,你会没事的。您应该将页面的所有现有链接更改为更短/更漂亮的链接(<a>,但也可以形成操作等。)

答案 4 :(得分:1)

我有同样的问题,但我的htacces是这样的:

RewriteEngine on
RewriteRule .* index.php [NC]

只需将L更改为L,一切正常。

最终代码:

RewriteEngine on
RewriteRule .* index.php [L]

答案 5 :(得分:0)

在我的情况下,我使用.htaccess。  请参阅:PHP $_POST not working?

即 action =“ booking.php”到action =“ booking”对我有用