创建类似于文件夹结构的博客帖子链接

时间:2013-08-28 22:34:18

标签: php html hyperlink

我目前正在撰写一个博客,我希望以下列形式创建指向我个别文章的链接:

http://www.mysite.com/health/2013/08/25/some-random-title
                      ------            -----------------
                        |                       |
                     category                 title

但我不知道如何实现这一目标。

我找到了能给我URI的东西。

$uri = $_SERVER["REQUEST_URI"];

然后我会继续提取所需的部分并对数据库发出请求。 这可能看起来是一个非常非常愚蠢的问题,但我不知道如何在谷歌上看这个(我试过......)但我究竟要如何处理这个链接呢?

我试着一步一步解释:

用户点击文章标题 - >页面重新加载新的uri - >我应该在哪里处理这个新的uri以及如何处理?如果请求路径如下所示:

index.php?title=some-random-article-title

我会在index.php中执行此操作并读取$ _GET数组并相应地处理它。但是,如何在本问题开头的拟议结构中做到这一点?

2 个答案:

答案 0 :(得分:4)

您需要做一些事情:

  1. 设置.htaccess将所有请求重定向到您的主文件,该文件将处理所有这些,例如:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    

    上述内容会将所有不存在的文件和文件夹的请求重定向到index.php

  2. 现在您要处理URL路径,以便您可以使用正如您所提到的PHP变量 $_SERVER['REQUEST_URI']

  3. 从中有很多解析它的结果来提取你想要的信息,你可以使用其中一个函数parse_urlpathinfoexplode来做如此。

  4. 使用parse_url这可能是最明确的做法:

    $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "https" : "http";
    $url = $s . '://' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
    var_dump(parse_url($url));
    

    输出:

    ["scheme"] => string(4) "http" 
    ["host"]   => string(10) "domain.com" 
    ["path"]   => string(36) "/health/2013/08/25/some-random-title" 
    ["query"]  => string(17) "with=query-string"
    

    所以parse_url可以很容易地分解当前的网址。

    例如使用pathinfo

    $path_parts = pathinfo($_SERVER['REQUEST_URI']);
    

    $path_parts['dirname']会返回/health/2013/08/25/

    $path_parts['basename']会返回some-random-title,如果有扩展名,则返回some-random-title.html

    $path_parts['extension']将返回空,如果它有扩展名,则会返回.html

    $path_parts['filename']会返回some-random-title,如果有扩展名,则返回some-random-title.html

    使用爆炸这样的东西:

    $parts = explode('/', $path);
    foreach ($parts as $part)
        echo $part, "\n";
    

    输出:

    health
    2013
    08
    25
    some-random-title.php
    

    当然,这些只是你如何阅读它的例子。

    您也可以使用.htaccess制定特定规则,而不是处理一个文件中的所有内容,例如:

    RewriteRule ^([^/]+)/([0-9]+)/([0-9]+)/([0-9]+)/([^/]+)/?$ blog.php?category=$1&date=$2-$3-$4&title=$5 [L]
    

    基本上上面的内容会分解网址路径并在内部将其重定向到您的文件blog.php并使用正确的参数,因此使用您的网址示例会将其重定向到:

    http://www.mysite.com/blog.php?category=health&date=2013-08-25&title=some-random-title
    

    但是在客户端浏览器上,URL将保持不变:

    http://www.mysite.com/health/2013/08/25/some-random-title
    

    还有其他一些功能可以派上用场,例如parse_urlpathinfo就像我早期提到的,服务器变量等...

答案 1 :(得分:1)

这称为语义URL,它们也被称为嵌入式URL。

您可以使用.htaccess命令RewriteURL

执行此操作

例如:

RewriteURL ^(.*)$   handler.php?path=$1

现在handler.php获得/health/2013/08/25/some-random-title,这是您的切入点。