PHP 参数 / 嵌套文件夹 / CMS


PHP parameter / Nested folder / CMS

假设我有一个网站 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,因为阿帕奇不会知道那只特定的鸟是否存在。