我目前正在写一个博客,我想以以下形式创建指向我个人文章的链接:
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数组并相应地处理它。但是,在这个问题开始时,我该如何处理拟议的结构呢?
您需要一些东西:
-
设置.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
-
现在您想要处理URL路径,这样您就可以使用前面提到的PHP变量
$_SERVER['REQUEST_URI']
。 -
从几乎所有的解析结果中提取您想要的信息,您可以使用函数
parse_url
、pathinfo
或explode
中的一个来实现这一点
使用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
,服务器变量等。
这被称为语义URL,它们也被称为slugified URL。
您可以使用.htaccess
命令RewriteURL
执行此操作
例如:
RewriteURL ^(.*)$ handler.php?path=$1
现在handler.php
得到/health/2013/08/25/some-random-title
,这就是您的切入点。