.htaccess 重写规则以将变量应用于每个页面

k4emjkb1  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(115)

我有一个网站,有4个文件夹。让我们说:

  • 示例网站/项目/文件夹1/

example.com/projects/folder2/
example.com/projects/folder3/
example.com/projects/folder4/*
每个文件夹都包含子文件夹和文件等...它们基本上是彼此的克隆,但它们都从不同的数据库名称中提取数据。
我想做的是合并到一个单一的文件夹,所以当一些变化,我只需要编辑1个文件,而不是4。

  • 示例网站/项目 *

然后使用url来指定它应该从哪个数据库获取数据:

  • 示例网站/项目/数据库1/*

到目前为止,我已经能够使用以下重写规则在主页上实现这一点:

  • 重写规则^项目/([a-z]+)/?$ /项目/索引.php?db=$1 [NC,L] #主页 *

但是如果我尝试它下面的任何链接,比如example.com/projects/database1/somefolder/somefile.php?id = 1&aa = bb,我会得到一个404错误。
是否可以完成我想做的事情,而不必为每个子文件夹/文件指定单独的重写规则?

tyg4sfes

tyg4sfes1#

为什么你的规则不工作的文件深入路径是,你的模式不匹配任何东西,除了路径只包含字母:
重写规则^项目/([a-z]+)/?$ /项目/索引.php?db=$1 [NC,L] #主页
在这里([a-z]+)完全匹配:从“a”到“z”的所有字母,不区分大小写。您必须将其更改为捕获该文件夹名称的内容,直到终止斜杠或请求路径的末尾:

RewriteRule ^/?projects/([^/]+) /projects/index.php?db=$1 [NC,L] # Homepage

然而,有一种更简单的方法,甚至不需要这样的“变量”。你不必在这个层次上提取信息。这就是经典的路由器方法:

RewriteRule ^/?projects/ /projects/index.php [L]

你的索引脚本可以通过“superglobal”变量$_SERVER['REQUEST_URI']来访问请求的路径,在php内部处理这样的任务要舒服得多,所以不是在协议层,而是在你的应用程序逻辑内部,在那里你可以简单地做一些类似的事情:

if (preg_match('|/projects/([^/]+)|i', $_SERVER['REQUEST_URI'], $token)) {
    $db = $token[1];
} else {
    throw new Exception("undefined database definition");
}
echo "Using database connnection '$db' ...";

$db将包含所需的文件夹名,即使没有您在协议层指定的变量。这显然允许在需要时使用更复杂的逻辑。

相关问题