2

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

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

4

2 回答 2

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 路径,以便可以使用$_SERVER['REQUEST_URI']前面提到的 PHP 变量。

  3. 从那里几乎可以解析它的结果以提取您想要的信息,您可以使用其中一个函数parse_urlorpathinfoexplode来执行此操作。

使用parse_urlwhich 可能是最常用的方法:

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

于 2013-08-28T22:41:01.573 回答
1

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

您可以使用.htaccess命令执行此操作RewriteURL

前任:

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

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

于 2013-08-28T22:38:16.783 回答