滥用Mod Rewrite用于干净的文件系统和漂亮的URL

时间:2010-07-29 17:39:18

标签: apache mod-rewrite

我有一些PHP文件可以完成一些不同的工作。我想改变客户端访问这些php文件的方式,使其对最终用户来说更加干净。 Mod_Rewrite系统已经证明,在正确的服务器管理员手中,它可以做一些非常强大的事情。所以我想知道你可以在多大程度上滥用Mod Rewrite规则来获得更清晰的文件系统和漂亮的URL。考虑到PHP文件本身使用查询字符串来获取它们的数据,我想根据我们去的伪文件系统的深度来对构建查询字符串的方式进行别名。

我们网站的网址为http://www.domain.tld/,但我们将其简称为domain.tld。我想在几个不同的文件上将几个不同的地址映射到几个不同的查询字符串。但我也想随心所欲地扩展。

或者第一个设置是,任何超过domain.tld/series/的内容应该被引导到domain.tld/series.php脚本,并且任何(假的)目录过去的系列都将成为series.php的查询字符串的一部分。对于应该重定向到domain.tld/users/文件的domain.tld/users.php方向指向的任何内容都应该这样。

因此,如果我们有domain.tld/series/Master/2010/domain.tld/series/Novice/Season 01/这样的网址,它们仍会被重定向到domain.tld/series.php脚本,但查询字符串为?0=Master&1=2010和{ {1}}。但是,如果我想要了解Master系列的概述,我可以使用URL ?0=Novice&1=Season 01并生成仅domain.tld/series/Master/的查询字符串。这个想法是重写规则应该允许无限的可扩展性。

2 个答案:

答案 0 :(得分:3)

这就是我这样做的方式,它确实无限可行:

RewriteRule ^((/?[^/]+)+)/?$ ?q=$1 [L]

技巧是整个路径作为单个参数q传递给index.php。例如,domain.tld/series/Novice/Season 01/变为domain.tld/?q=series/Novice/Season 01。然后你可以这样做:

<?php
$params = explode('/', $_GET['q']);
var_dump($params);
?>

获取各个部分。

array(3) { 0 => 'series', 1 => 'Novice', 2 => 'Season 01' }

答案 1 :(得分:2)

在这样的系统中不可能完全动态,并且正如你所说的那样,具有无限的可扩展性。您必须为URL中允许的每个“层”定义一个RewriteRule,或者将第一个“层”之后的所有内容作为单个变量进行匹配,并使用PHP进行工作。

示例1

RewriteRule ^([^/]+)/?$ /$1.php
RewriteRule ^([^/]+)/([^/]+)/?$ /$1.php?0=$2
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /$1.php?0=$2&1=$3

示例2

RewriteRule ^([^/]+)/(.*)/? /$1.php?qs=$2

显然这些只是非常简单的例子,你可能不得不使用RewriteConds等来豁免某些文件等。

相关问题