【问题标题】:POSTing a form to '/' gets a 301将表单发布到“/”会得到 301
【发布时间】:2016-05-10 11:30:01
【问题描述】:

在项目的根目录 ('/') 我有一个仪表板类型的页面,它被路由到'Patterns:: index'。这适用于使用 GET 加载页面,但我在此页面上还有一个表单,我想将 POST 请求发送到相同的操作。

config/routes.php

Router::connect('/', 'Patterns::index');

视图上的表单创建行如下所示:

<?= $this->form->create($filter, ['url' => ['Patterns::index'], 'method' => 'post']) ?>

注意:它也看起来像这样,但它也不起作用:

<?= $this->form->create($filter) ?>

此表单生成的操作是项目“../client-name”(根)的正确路径,方法为 POST。但是当我点击提交时,它会尝试将请求发送到此路由并获得 301,然后重定向到“../client-name/”(注意尾部的正斜杠)。

如果我在 HTML 中手动编辑浏览器中的操作以使用尾部正斜杠,请求会按预期通过 - 它会向“Patterns::index”发送 POST 请求。

还有一点需要注意的是,如果我删除 config/routes 中的行并通过转到“/patterns”来访问它,一切都会按预期工作......

有人能指出正确的方向吗?

【问题讨论】:

    标签: php lithium


    【解决方案1】:

    导致 301 重定向的可能是您的 Web 服务器,而不是 Lithium。您可能在 Web 根目录中有一个名为 client-name 的物理文件夹。您的 Web 服务器将自动添加斜杠,因为它打算在该文件夹中提供索引。另一种可能性是您的 Web 服务器(apache?或 nginx?)在某处有一个重写规则,该规则将 301 重定向到任何没有尾部斜杠的 url。

    Lithium 使用PHP_SELF 环境变量来确定lithium\action\Request::_base() method 中的基本文件夹。

    表单操作的 url 是通过lithium\net\http\Router::match() 方法生成的。代码中有一行去掉了所有尾部斜杠:https://github.com/UnionOfRAD/lithium/blob/7251cc28/net/http/Router.php#L434

    因此,Lithium 绝对偏向于没有尾部斜杠的网址。这种限制可能需要在项目的 github 存储库中提交问题。如果您在框架中编辑 Router.php 文件并将其添加到修剪路径的行之后,它将始终包含不带后缀(即文件扩展名)的 url 路径的尾部斜杠:

    if (!$suffix && $path !== '/') {
        $path .= '/';
    }
    

    我不确定是否有其他方法。 IIRC,当我在项目中遇到这个问题时,我将物理文件夹移动到不同的位置,这样我的网络服务器就不会发出 301 重定向。

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多