【问题标题】:How can I append .html to all my URLs in cakephp?如何将 .html 附加到 cakephp 中的所有 URL?
【发布时间】:2011-03-25 13:08:44
【问题描述】:

我在我的一个项目中使用 cakephp,我的客户希望网站 URL 以 .html 结尾,而不是通常的友好 URL。我想知道 cakephp 是否可以通过它的任何路由技术来做到这一点。请帮忙。

【问题讨论】:

  • 我建议你向你的客户解释为什么它很重要
  • 听起来客户可能需要更多的教育。我想不出任何需要 .html 扩展名的理由。谁能赐教?
  • 嗯,它是一个 SEO 的东西。当搜索引擎爬虫找到扩展名为 .html 的页面时,它会假定它是一个静态页面并给予它更高的排名。我不确定这些天现代爬虫是否会遵循这一点,但我的客户想要它,所以我必须给它:)

标签: php cakephp routing url-rewriting


【解决方案1】:

根据this page,你可以这样做

Router::connect('/(.*).html', array('controller' => 'pages', 'action' => 'display'));

但正如您所说的扩展,这可能会产生其他后果。

【讨论】:

  • 您好 Lucas Heneks,感谢您的链接。我试过了,但它似乎对我不起作用......它给了我缺少控制器的错误。
【解决方案2】:

您还需要将 html 扩展名与 Apache 中的 PHP 模块相关联。我不记得确切需要的调整,但它会在 /etc/httpd/httpd.conf 文件中。 (根据您的服务器的操作系统,此文件的位置可能略有不同。)只需查找将 .php 与 PHP 模块相关联的行。我相信您也可以在 .htaccess 文件中定义它,但天气与否取决于您在 httpd.conf 文件中允许执行的操作。

【讨论】:

  • 这不是必需的,因为 Apache 只会通过 Cake、扩展和所有内容路由所有内容,因为实际上不存在任何 .html 文件。如果您有想要由 PHP 处理的物理 HTML 文件,您只需要执行您描述的操作,这里不是这种情况。
【解决方案3】:

您可以发送到 Router::url() 的参数之一(由 HtmlHelper::link() 和 Controller::redirect() 等其他方法调用)是“ext”。尝试将其设置为“html”。例如:

echo $this->Html->link('Products', array('controller' => 'products', 'action' => 'index', 'ext' => 'html'));

或

$this->redirect(array('controller' => 'products', 'action' => 'index', 'ext' => 'html'));

如果可行,请尝试找出一种方法可以覆盖 Router::url() 以默认添加它。

【讨论】:

【解决方案4】:

cookbook 中有详细记录。

更新:http://book.cakephp.org/2.0/en/development/routing.html#file-extensions

要使用路由处理不同的文件扩展名,您需要一个 路由配置文件中的额外行:

Router::parseExtensions('html', 'rss');

如果您想创建一个 URL,例如 /page/title-of-page.html,您可以 如下图所示创建您的路线:

Router::connect(
    '/page/:title',
    array('controller' => 'pages', 'action' => 'view'),
    array(
        'pass' => array('title')
    )
);

然后要创建映射回路线的链接,只需使用:

$this->Html->link(
    'Link title',
    array('controller' => 'pages', 'action' => 'view', 
          'title' => 'super-article', 'ext' => 'html')
);

【讨论】:

  • 我认为必须有一种更好的方法可以将 .html 添加到所有控制器的操作中,而不是手动为每个控制器提供 ext=> 'html'。此外,如果要打开/关闭 .html 扩展名,则转到所有控制器并手动添加/删除 ext 参数是没有意义的。如果有人想让 Joomla 像 seo 一样开/关,你会怎么说?
  • @RNKushwaha:如果这是您的评论的意思,您可以将文件扩展名注入 AppHelper::url() 中的每个链接。
【解决方案5】:

必须在不使用路由的情况下解决这个问题。保留页面的默认路由条目:

Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

并在显示操作中删除了 .html 扩展名并呈现了相应的视图:

preg_replace('/\.html$/','',$view);
$this->render(null,'default',$view);

调用页面时添加'ext'为.html

【讨论】:

    【解决方案6】:

    正如Routes Configuration - File extensions 文档部分所说,您可以使用:

    Router::parseExtensions('html', 'rss');
    

    这将告诉路由器删除任何匹配的文件扩展名,然后解析剩下的内容。

    【讨论】:

      【解决方案7】:

      非常简单,打开文件 app/config/routes.php 并添加

      Router::parseExtensions('html', 'rss');
      

      上线

       Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
      

      现在您甚至可以使用 .html 扩展名访问您的控制器方法。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2011-11-08
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多