【问题标题】:.htaccess, preserve post data on url rewrite.htaccess,在 url 重写时保留帖子数据
【发布时间】:2021-12-01 20:40:48
【问题描述】:

到处都有类似问题的帖子,但在我的情况下没有一个有效。 我想在重写 URL 时保留 POST 数据。

在我的 .htaccess 文件中,我有

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

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

[编辑] 这可能是由于从 url 中删除了 php 扩展名的情况。在 RewriteEngine On 之后,我在 .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]

当我重写其他此类网址时,我也遇到了同样的问题。 有人可以在这种情况下提出解决方案。提前感谢您的建议和 cmets。

【问题讨论】:

  • 感谢分享您的努力,您能否详细说明一下How can I preserver the POST data with this url rewrite rule 一次?谢谢。
  • $_POST 数组不会因内部重写而丢失。您可能有其他问题导致完全重定向(浏览器中的 URL 更改)
  • “当我重写其他此类网址时,我也遇到了同样的问题。” - 你指的是 POST 请求吗?请举个例子。
  • 是的,我指的是 POST 请求。例如,我通过他们在数据库中的 ID 获取业务信息(或用户信息),当我想更新信息时,数据会丢失在某处。我通过 POST 方法发送数据。 .htaccess 文件有类似的东西。 RewriteRule ^user-details/([0-9]+)$ userdetails.php?userid=$1 [L] 或 RewriteRule ^business-details/([0-9]+)$ business.php?bid=$1 [L] ]。当我想显示 POST 数据时,结果是一个空值数组。 print_r($_POST) -> 数组()。或者 var_dump($_POST) -> array(0) { }.
  • 那些是内部重写,它们不会导致 POST 数据丢失。你有任何其他指令或任何其他.htaccess 文件吗?你有任何规范的重定向吗?

标签: .htaccess url-rewriting


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

  • 我都试过了(添加了一个只有 GET 请求被重定向的条件以及 308)不幸的是我仍然得到空值数组。
  • @mtmehdi 然后似乎发生了其他事情。要确认,您是否将表单提交到无扩展 URL?如果您监控网络流量,您是否看到任何重定向? POST 数据不能简单地丢失,除非某些东西(在 PHP 中)故意擦除 POST 数据或触发 301/2/3 外部重定向。
  • !是的,我将表单提交到无扩展 URL。我将表单的 action 属性设置为 $_SERVER['REQUEST_URI'] ,它返回无扩展 URL。但是现在我大多省略了 action 属性来将数据发布到同一页面。早些时候我有一个来自 SiteGround 的主机,当我将表单的操作属性设置为另一个页面时,POST 数据丢失了,但是当我将表单的操作属性设置为同一页面时,它运行良好。无论我将数据发送到同一页面还是另一个页面,相同的文件在 localhost 上运行良好。我现在没有发现任何异常。
  • 非常感谢您的有用建议。我会检查是否有其他东西触发了外部重定向。
猜你喜欢
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
相关资源
最近更新 更多