.htaccess,在url重写时保留post数据



到处都有关于类似问题的帖子,但在我的案例中没有一个奏效。我想在重写URL时保留POST数据。

在我的.htaccess文件中,我有

RewriteRule ^blogs/([a-z0-9]+)$ blog-details.php?blog=$1 [L]

当提交此页面上的表单时,我会得到一个空数组。如何使用这个url重写规则来保存POST数据。提前感谢您的建议。

[编辑]这可能是因为从url中删除了php扩展名。在.上重写引擎之后,我在.htaccess文件的开头有这些规则

RewriteCond %{THE_REQUEST} /([^.]+).php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

完整的.htaccess文件如下:

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+).php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
RewriteRule ^blogs/([a-z0-9-]+)$ blog-details.php?blog=$1 [L]

当我重写其他类似的url时,我也遇到了同样的问题。有人能为这种情况提出解决方案吗。提前感谢您的建议和意见。

如注释中所述,内部重写不会丢失POST数据。(他们不会更改请求类型。(

这可能是由于php扩展从url中删除的原因。我在.htaccess文件的顶部有这些规则。

可能。如果您使用.php扩展提交到URL,则302重定向将导致浏览器在重定向响应后发出GET请求,POST数据将丢失。然而,表单应该提交到规范URL(即没有文件扩展名(,因此删除.php的重定向应该与此无关。

如果您无法修改表单提交到的URL,那么您可以在规则中包含一个例外,即删除文件扩展名(尽管这在一定程度上违背了无扩展名URL的原则(。

您可以添加条件,以便仅重定向GET请求。例如:

RewriteCond %{REQUEST_METHOD} =GET [NC]
RewriteCond %{THE_REQUEST} s/([^.?]+).phps [NC]
RewriteRule ^ /%1 [L,R]

这实际上应该是一个301(永久(重定向。(目前默认为302,临时重定向。(

或者,您可以将其更改为308(永久(重定向,该重定向应在整个重定向中保留请求方法。然而,重定向表单提交没有意义(而且效率低下(。

为了澄清,您在整个网站中链接到的URL没有.php扩展?

最新更新