假设我有一个网站 birdsovertheworld.com/,我想以我所知道的鸟类的形式添加一些内容。我(据我所知)可以做到
a) birdsovertheworld.com/bird/hummingbird/
或
b) birdsovertheworld.com/bird/show.php?bird=hummingbird
使用 a) 似乎很愚蠢,因为它需要我手动为每只鸟创建一个文件夹 + 一个索引文件。
另一方面,使用b)会(再次,就我而言)损害SEO和可读性。
我熟悉的CMS不适用于我的目的(WordPress,Joomla)+在这种特殊情况下,我宁愿不使用它。
我的问题是:- 如何在不手动创建文件夹和索引文件且不使用示例 B 的情况下实现用户和搜索引擎易于读取的 URL?
谢谢
a) 实际上是一个有效的选项。 我们通过强制 Apache 将某些脚本读取为 PHP 来做到这一点,即使它们没有文件扩展名。
因此,"bird"是一个PHP脚本,它读取被调用的URL,并包含/生成根据url字符串的内容而变化的内容:
$called = $_SERVER['REQUEST_URI'];
$parts = explode("/",$called);
$birdname = $parts[1];
switch($birdname) { // or whatever logic.
Apache配置使用ForceType application/x-httpd-php5。
例如,如果你查看WordPress .htaccess
文件,你会看到这样的内容:
RewriteEngine On
RewriteBase /
RewriteRule ^index'.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
这告诉 Apache 将浏览器正在访问的任何不存在的文件或文件夹重定向到 index.php
。
然后,在 PHP 端,您可以在 $_SERVER['REQUEST_URI']
变量中获取原始请求的 url。
最后,您可以使用explode(...)
访问请求的路径:
$path = explode('/', $_SERVER['REQUEST_URI']);
switch($path[1]){
case 'bird':
//do your things
break;
default:
//404
}
请记住,你必须正确处理404 errors
,因为阿帕奇不会知道那只特定的鸟是否存在。