代码之家  ›  专栏  ›  技术社区  ›  Mark Tomlin

滥用Mod Rewrite来获得一个干净的文件系统和漂亮的url

  •  0
  • Mark Tomlin  · 技术社区  · 15 年前

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

    http://www.domain.tld/ ,但我们称之为 domain.tld 简而言之。我想把几个不同的地址映射到几个不同文件上的几个不同的查询字符串。但我也希望自己能随心所欲地扩展。

    或者第一盘是,任何过去的事 domain.tld/series/ domain.tld/series.php 在series之前使用任何(假)目录编写脚本,使其成为series.php的查询字符串的一部分。同样的情况也会发生在任何指向 domain.tld/users/ 应该重定向到 domain.tld/users.php

    所以如果我们有这样一个网址, domain.tld/series/Master/2010/ domain.tld/series/Novice/Season 01/ 它们仍将被重定向到 脚本,但查询字符串为 ?0=Master&1=2010 ?0=Novice&1=Season 01 . 但如果我想获得一个主系列的概述,我可以去的网址 domain.tld/series/Master/ 并生成 ?0=Master . 其思想是重写规则应该允许无限的可扩展性。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Peter O'Callaghan    15 年前

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

    例1

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

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

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

        2
  •  3
  •   Core Xii    15 年前

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

    诀窍是把整个路径作为单个参数传递, q 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' }
    
    推荐文章