1

这个问题可能存在于其他地方,如果是这样,我道歉。在搜索了一个小时没有成功后,我不禁认为我走错了路。

本质上,我正在寻找的是一种在页面 URL 中强制描述或标题的方法。我正在使用 CodeIgniter,因此将漂亮的 URL 放在任何我想要的地方都非常简单。

我本可以有:

http://mysite.com/controller/function/what-ever-i-want/can-go-here

它总是会去:

http://mysite.com/controller/function/

与变量值what-ever-i-wantcan-go-here

如果只给出控制器/功能,我想要的是自动重写 URL 以包含标题。

所以,如果有人去:

http://mysite.com/controller/function/

它应该自动将 url 重写为

http://mysite.com/controller/function/a-more-descriptive-title/

我正在谈论的功能的一个很好的例子是 SO URL。如果您访问https://stackoverflow.com/questions/789439,它会自动将其重写为https://stackoverflow.com/questions/789439/how-can-i-parse-descriptive-text-to-a-datetime -目的

我怀疑涉及到 mod_rewrite,但我想提出最适合使用 CodeIgniter 的解决方案。

我对漂亮的 url 场景非常陌生,并且拼命寻求有更多经验的人的建议。提前感谢您提供的任何帮助!

4

2 回答 2

1

我不使用 CodeIgniter,但您应该能够将代码放置在控制器的 __construct 中,或者如果 CI 有这些,则可以放置在某种预操作事件中。

您只需查找正在查看的实体的相应 URL,并在必要时执行 301 重定向。

于 2012-08-30T21:15:04.783 回答
1

我使用 Fiddler2 来了解 Stackoverflow 是如何做到这一点的。

部分回应来自http://stackoverflow.com/questions/12205510/

HTTP/1.1 301 Moved Permanently
Location: /questions/12205510/how-can-i-enforce-a-descriptive-url-with-codeigniter
Vary: *
Content-Length: 0

所以基本上当我们去的时候,controller/function/我们需要将用户重定向到controller/function/my-awesome-title. 我编写了简单的控制器来做到这一点:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Controller extends CI_Controller
{
    protected $_remap_names = array();

    function __construct()
    {
        parent::__construct();

        $this->_remap_names['func'] = "My Awesome Title";
    }

    function _remap($method, $arguments)
    {
        if(
            isset($this->_remap_names[$method])
            && sizeof($arguments) == 0
            && method_exists($this, $method)
            )
        {

            $this->load->helper("url");

            $title = str_replace(" ", "-", $this->_remap_names[$method]);
            $title = strtolower($title);

            $url   = strtolower(__CLASS__)."/$method/$title";
            $url   = site_url($url);

            // if you dont want to have index.php in url
            $url   = preg_replace("/index\.php\//", "", $url);

            header("HTTP/1.1 301 Moved Permanently");
            header("Location: $url");
            header("Vary: *");
        }
        else
        {
            call_user_func_array(array($this,$method), $arguments);
        }
    }

    function func()
    {
        echo "<h1>";
        echo $this->_remap_names[__FUNCTION__];
        echo "</h1>";
    }

};

CodeIgniters_remap函数的文档可以Remapping Function Calls 部分找到。

于 2012-08-30T23:31:37.990 回答