A reescrita de URL do CakePHP entra em conflito com CakeRequest::onlyAllow
-
21-12-2019 - |
Pergunta
estou usando $this->request->onlyAllow('post', 'delete');
de modo a permitir apenas a exclusão de registros provenientes de um POST
solicitar.
O problema é que estou usando a reescrita de URL no meu .htaccess
arquivo e está alterando a solicitação de um POST
para um GET
Isso é o que meu .htaccess
arquivo se parece com:
<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>
estou usando o postLink
FormHelper para gerar um botão de exclusão:
<?php
echo $this->Form->postLink(__('Delete'),
array('
controller'=>'posts',
'action' => 'delete',),
null,
__('Are you sure you want to delete "%s?"', $attachment['Post']['name']));
?>
O problema é que a ação para o formulário gerado a partir do auxiliar ainda não possui a barra final, então a regra htaccess entra em ação e anuncia isso, o que essencialmente muda isso de um POST
método para um GET
URL de ação gerado: posts/delete/33579
URL de ação necessário: posts/delete/33579/
Eu tentei adicionar uma barra no $this->Form->postLink()
função, no entanto, o Cake codifica a barra e a altera para um %2F
.
Estou usando o CakePHPH 2.3.1
Alguma sugestão sobre como consertar isto?
Solução
Este é o comportamento padrão para um redirecionamento.Você tem duas opções:
- Corrigindo a URL que é gerada.Este é o mais sensato, como você provavelmente pode imaginar
Impedir que a regra corresponda se a solicitação for uma solicitação POST (ou apenas permitir que ela corresponda a uma solicitação get).Você pode fazer isso com
%{THE_REQUEST}
RewriteCond %{THE_REQUEST} ^GET\ / RewriteRule ^(.+)([^/])$ $1$2/ [NE,R=301,L]