在项目的根目录(' /')我有一个仪表板类型的页面,路由到' Patterns :: index'。这适用于使用GET加载页面,但我在此页面上还有一个表单,我想将POST请求发送到同一个操作。
配置/ routes.php文件
Router::connect('/', 'Patterns::index');
视图上的表单创建行如下所示:
<?= $this->form->create($filter, ['url' => ['Patterns::index'], 'method' => 'post']) ?>
注意:它也看起来像这样,但它也没有工作:
<?= $this->form->create($filter) ?>
此表单生成的操作是项目的正确路径&#39; ../ client-name&#39; (根),用POST方法。但是当我点击提交时,它尝试将请求发送到此路由并获得301,然后重定向到&#39; ../ client-name /&#39; (注意正斜杠)。
如果我在HTML中手动编辑浏览器中的操作以使前瞻性斜杠按预期进行请求 - 它向&#39; Patterns :: index&#39;发送POST请求。
要注意的是,如果我删除config / routes中的行,只需访问&#39; / patterns&#39;一切都按预期工作......
有人能指出我正确的方向吗?
答案 0 :(得分:0)
可能是您的网络服务器而不是锂电池导致301重定向。您可能在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
因此,锂电池绝对偏向没有尾随斜线的网址。该限制可能需要在项目的github存储库中提交问题。如果你在框架中编辑Router.php
文件并在修剪路径的行之后添加它,它将始终包含没有后缀的url路径的尾部斜杠(即文件扩展名):
if (!$suffix && $path !== '/') {
$path .= '/';
}
我不确定是否还有另一种方式。 IIRC,当我在项目中遇到此问题时,我将物理文件夹移动到其他位置,因此我的Web服务器不会发出301重定向。