将表单发布到' /'获得301

时间:2016-05-10 11:30:02

标签: php lithium

在项目的根目录(' /')我有一个仪表板类型的页面,路由到' 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;一切都按预期工作......

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

1 个答案:

答案 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重定向。