一尘不染

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

php

我目前在一个博客上工作,我想以以下形式创建指向我的个人文章的链接:

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

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

我找到了可以给我URI的东西。

$uri = $_SERVER["REQUEST_URI"];

然后,我将继续提取所需的部分并针对数据库进行请求。这似乎是一个非常非常愚蠢的问题,但是我不知道如何在Google上查找该问题(我尝试过…),但是我将如何处理该链接呢?

我尝试逐步解释它:

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

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

我会在index.php中做到这一点,并读取$ _GET数组并进行相应处理。但是,在问题开始时,如何使用建议的结构来实现?


阅读 199

收藏
2020-05-29

共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]

上面的命令会将所有不存在的文件和文件夹的请求重定向到您的 index.php

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

  2. 从那里几乎可以解析它的结果来提取所需的信息,您可以使用函数之一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_url
,还有其他一些功能可能会派上用场,
pathinfo

例如我前面提到的服务器变量等。

2020-05-29