将表单张贴到'/';得到301


POSTing a form to '/' gets a 301

在项目的根('/')处,我有一个仪表板类型的页面,它被路由到"Patterns::index"。这对于用GET加载页面来说很好,但我在这个页面上也有一个表单,我想向相同的操作发送POST请求。

config/routes.php

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

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

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

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

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

此表单生成的操作是项目"的正确路径/客户端名称'(根),方法为POST。但当我点击提交时,它会尝试将请求发送到此路由,并得到301,然后重定向到"…"/客户端名称/'(注意后面的正斜杠)。

如果我在HTML中手动编辑浏览器中的操作,使其具有尾部正斜杠,则请求会按预期进行——它会向"Patterns::index"发送POST请求。

需要注意的是,如果我删除config/routes中的行,并通过转到"/patters"来访问它,那么一切都会按预期进行。。。

有人能给我指正确的方向吗?

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

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

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

因此,Lithium肯定倾向于没有斜杠的url。这一限制可能会保证在该项目的github存储库中提交问题。如果您在框架中编辑Router.php文件,并将其添加到修剪路径的行之后,它将始终包括没有后缀(即文件扩展名)的url路径的尾部斜杠:

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

我不确定是否还有别的办法。IIRC,当我在一个项目中遇到这个问题时,我将物理文件夹移动到了另一个位置,这样我的web服务器就不会发出301重定向。