CakePHP 3中301重定向:/page/跳转至/page的实现方案
CakePHP 3.3.16 301重定向问题解决方案
嘿,我来帮你梳理下这个重定向的问题,一步步给你讲清楚:
一、你给出的routes.php配置是否可行?如何设置301?
你的思路方向是对的,但有几个细节需要调整:
- 路由匹配是按顺序执行的,重定向规则必须放在普通路由前面,否则会被后面的
/page/*规则先匹配到,重定向就不会生效了。 - 默认情况下,
$routes->redirect()生成的是302临时重定向,要指定301永久重定向,需要添加第三个参数['status' => 301]。 - 你写的
/page/?*路由写法不太对,?*是用来匹配查询字符串的,不是路径参数,保留原来的/page/*就可以覆盖/page和/page/xxx这类请求。
修正后的routes.php配置
use Cake\Routing\RouteBuilder; use Cake\Routing\Router; Router::scope('/', function (RouteBuilder $routes) { // 仅匹配尾部带斜杠的 /page/,301重定向到不带斜杠的 /page $routes->redirect( '/page/', '/page', ['status' => 301, 'persist' => false] ); // 原有的路由,匹配 /page 和 /page/xxx 等所有以/page开头的请求 $routes->connect('/page/*', ['controller' => 'Page', 'action' => 'something']); });
persist参数设为false是为了避免自动携带查询参数,如果需要保留参数可以去掉这个配置(默认是true)。
二、为什么你的.htaccess配置没生效?
你写的Redirect 301 /page/ http://website.com/page没生效,是因为mod_rewrite的规则优先级更高,而且你把Redirect放在了RewriteEngine On之前,后面的RewriteRule ^ index.php [L]里的[L]表示这是最后一条规则,请求会直接转发到index.php,CakePHP的路由接管了所有请求,所以你的Redirect规则根本没机会执行。
修正后的.htaccess配置
如果想用Apache的配置来处理重定向,需要把重写规则放在RewriteCond之前,并且用RewriteRule来实现:
<IfModule mod_rewrite.c> RewriteEngine On # 301重定向 /page/ 到 /page RewriteRule ^page/$ /page [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
这样RewriteRule ^page/$会先匹配到/page/请求,执行301重定向后就终止规则([L]),不会走到后面的index.php转发。
三、两种方案怎么选?
- 如果你想保持框架路由的统一性,推荐用CakePHP路由的方案,这样所有路由规则都集中在routes.php里,更便于维护。
- 如果你需要绕过框架直接处理静态重定向,或者网站有大量类似的重定向需求,用**.htaccess的方案**会更高效。
内容的提问来源于stack exchange,提问作者sdexp
相关产品推荐
相关产品推荐

