【问题标题】:Create blog post links similar to a folder structure创建类似于文件夹结构的博客文章链接
【发布时间】:2013-09-01 04:55:38
【问题描述】:

我目前正在开发一个博客,我想在其中创建指向我的个人文章的链接,格式如下:

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 数组并相应地处理它。但是我该如何使用这个问题开头提出的结构呢?

【问题讨论】:

    标签: php html hyperlink


    【解决方案1】:

    你需要一些东西:

    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中的一个函数来做到这一点。

    使用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 可以轻松分解当前 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]
    

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

    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,就像我之前提到的、服务器变量等...

    【讨论】:

    • 太棒了!像魅力一样工作!
    • @MartinE。再读一遍,更新一些可能很有趣的内容。
    • 非常感谢您为 Prix 所做的努力,我一定会仔细研究一下!
    • 虽然有一个问题......我似乎失去了通往我的样式表的路径。有什么办法可以解决吗?
    • 例如有一个config.php文件,其中包含一些经常使用的基本信息$url = 'http://domain.com'; $css = $url . '/css'; $images = $url . '/images';然后你可以将它附加到你的样式或图像HTML代码echo 'rest of the code....src="' . $css . '/style.css"... rest of the code'
    【解决方案2】:

    这称为语义 URL,它们也称为 slugified URL。

    您可以使用.htaccess 命令RewriteURL 来做到这一点

    例如:

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

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

    【讨论】:

    • 我想你的意思是RewriteRule,而不是RewriteURL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多