cakephp重写url无法正常工作

时间:2015-06-24 01:53:48

标签: php .htaccess cakephp mod-rewrite cakephp-2.1

我有CakePHP简单程序(CakePHP:版本2.1.3,Centos 6.x和Apache:2.2.15)。

现在我要更改网址:http://domain.com/frontend/login

到新的网址:http://domain.com/user-login.html

我想使用新网址,并删除旧网址。

我试图重写(通过使用mod重写的配置.htaccess,我已经确认了/etc/httpd/conf/httpd.conf:将AllowOverride None更改为AllowOverride All)。

和一些.htaccess文件如下:

/root/.htaccess

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
   #rewrite to new url
   RewriteRule ^frontend/login$  user-login.html [L]
 </IfModule>

/root/app/.htaccess

 <IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$    webroot/    [L]
   RewriteRule    (.*) webroot/$1    [L]
 </IfModule>

和/root/app/webroot/.htaccess

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

但我的新网址http://domain.com/user-login.html无效。

我的配置有什么问题吗?

1 个答案:

答案 0 :(得分:1)

您不应该使用.htaccess执行此操作。如果你这样做,CakePHP将无法理解请求。

相反,您需要将路由连接到CakePHP本身的控制器。实际上,您正在为相关控制器方法创建别名 URI。路由文档可在此处获取:

http://book.cakephp.org/2.0/en/development/routing.html

基本上,您需要打开app/Config/routes.php,然后输入以下内容:

Router::connect(
    '/user-login.html',
    array('controller' => 'frontend', 'action' => 'login')
);

(假设您的控制器名为frontend。)

如果这不起作用,那么您可能需要告诉CakePHP首先解析并删除扩展名:

Router::parseExtensions('html');

然后这样路线:

Router::connect(
    '/user-login',
    array('controller' => 'frontend', 'action' => 'login')
);

注意:我没有测试过这个。以上内容仅基于文档中描述的内容。

更新:从旧URI重定向

现在应用程序了解您要使用的路由,您可以在第一个.htaccess文件中创建重定向:

RewriteEngine On
RewriteRule ^frontend/login$ /user-login.html [R=302,L]
# ... etc ...

或者,您可以在路线配置中使用Router::redirect()

Router::redirect('/frontend/login', '/user-login.html', array('status' => 302));

(要使浏览器和搜索引擎永久重定向并进行缓存,请将302更改为301。)