Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP URL重写与CakereRequest::onlyAllow冲突_Php_.htaccess_Cakephp_Mod Rewrite_Cakephp 2.3 - Fatal编程技术网

CakePHP URL重写与CakereRequest::onlyAllow冲突

CakePHP URL重写与CakereRequest::onlyAllow冲突,php,.htaccess,cakephp,mod-rewrite,cakephp-2.3,Php,.htaccess,Cakephp,Mod Rewrite,Cakephp 2.3,我正在使用$this->request->onlyAllow('post','delete')以便仅允许删除来自POST请求的记录 问题是我在.htaccess文件中使用URL重写,它将请求从POST更改为GET 这就是我的.htaccess文件的外观: <IfModule mod_rewrite.c> Options -Indexes RewriteEngine On RewriteBase /example RewriteRule ^homes/

我正在使用
$this->request->onlyAllow('post','delete')
以便仅允许删除来自
POST
请求的记录

问题是我在
.htaccess
文件中使用URL重写,它将请求从
POST
更改为
GET

这就是我的
.htaccess
文件的外观:

<IfModule mod_rewrite.c>
    Options -Indexes
    RewriteEngine On
    RewriteBase /example

    RewriteRule ^homes/$    http://dev.example.com/          [R=301,L]    

    # if this is an existing folder/file then leave
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule . - [L]

    # if no trailing slash then redirect to url with trailing slash
    RewriteRule ^/?(.+)([^/])$ $1$2/ [NE,R=301,L]

    # internal rewrite to controller/dispatcher index.php
    RewriteRule ^.*$ index.php [L,QSA]
</IfModule>
问题是,从帮助程序生成的表单的操作还没有尾部斜杠,因此htaccess规则会介入并添加ads,从而本质上将其从
POST
方法更改为
GET

生成的操作url:
posts/delete/33579
需要的操作url:
posts/delete/33579/

我曾尝试在
$this->Form->postLink()
函数中添加斜杠,但Cake对斜杠进行编码并将其更改为
%2F

我使用的是Cakephph2.3.1


关于如何修复此问题有何建议?

这是重定向的标准行为。您有两个选择:

  • 正在修复生成的url。正如你可能想象的那样,这是最明智的选择
  • 如果请求是POST请求(或仅让其与get请求匹配),则阻止规则匹配。您可以使用
    %{THE_REQUEST}

    RewriteCond %{THE_REQUEST} ^GET\ /
    RewriteRule ^(.+)([^/])$ $1$2/ [NE,R=301,L]
    

onlyAllow()(或allowMethod()代表2.5+)应该是你行动的第一件事:)你能提供一个你建议@mark的例子吗?参见示例。它应该是你行动方法的第一行。否则将不必要地触发SQL查询。您始终可以扩展帮助程序并覆盖生成URL的方法,以便附加斜杠。然而,无论如何,这有什么意义,为什么URL是否有尾随斜杠有关系呢?答案是:不要。不要使用尾随斜杠,使用Cake标准(没有尾随斜杠)-或者看看你的代码是否正常工作,但是我有点紧张使用它。这是否会产生任何不利影响或造成任何安全风险?另外,您对修复生成的url有什么建议吗?我不知道CakePHP是如何工作的,所以我不能就此向您提供建议。没有安全含义,因为您不应该对与安全相关的事情使用重写。不过,我对我的答案做了一点修改,因为实际的重写可以做得更简单,如现在的答案所示。实际上,您的第一个代码工作得更好。您当前的代码似乎添加了一个额外的尾部斜杠,使应用程序中断;显然我现在还没有完全清醒。
RewriteCond %{THE_REQUEST} ^GET\ /
RewriteRule ^(.+)([^/])$ $1$2/ [NE,R=301,L]