apache mod_rewrite一个规则,适用于多种可能性

时间:2020-03-06 14:34:06  来源:igfitidea点击:

我正在建立一个相当大的网站,而我的.htaccess文件开始感到有些肿,有没有一种方法可以将我可能使用的每个var数替换为一个规则的当前系统,从而捕获所有表达式可以解释不同数量的投入?

例如,我目前有:

RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=&id=&=&=
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=&id=&=
RewriteRule ^([a-z]+)/([^/]*)$ /index.php?mode=&id=
RewriteRule ^([a-z]+)$ /index.php?mode=

第一个反向引用始终是模式,第二个反向引用始终是id(如果存在),此后,任何其他反向引用都将在输入名称及其值之间交替

http://www.example.com/search
http://www.example.com/search/3039/sort_by/name_asc/page/23

我希望能够有一个表达式来优雅地处理所有输入。

解决方案

喜欢Drupal:

RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q= [L,QSA]

然后使用php代码处理脚本中的所有内容

$pathmap = ();
if ($_GET["q"]){
    $path = split("/", $_GET["q"]);
    for ($i=0; $i+1<count($path); $i++){
        $pathmap[$path[$i]] = $path[$i+1];
        $i++;
    }
}

我不相信它们是一种方法,但我想我们最好的选择是让脚本" index.php"处理路径,而不必进行大量的反向引用。

因此,例如,重写

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

或者类似的...然后,这将使$ _SERVER ['REQUEST_URI']变量包含路径信息,我们可以对其进行拆分和解析。

$path = split('/', $_SERVER['REQUEST_URI']);
array_shift($path); // We always have a first null value
$mode = array_shift($path);

最终以$ mode包含模式,$ path包含路径其余部分的元素数组,因此

http://example.com/foo/bar/baz

会让$ mode为'foo',而$ path为包含'bar'和'baz'的数组

我不知道是否可以使用单个表达式来完成,但是无论查询字符串有多长,都可以使用固定数量的表达式来完成。

mod_rewrite规则将被重复调用,为我们提供有时称为mod_rewrite递归的规则。有一些避免它的技术,但我认为我们想使用它。

设置一个规则,用name = value&替换最后一对

继续将输入查询字符串添加到输出。每次输入,查询字符串将变长,URL变短。

最终,我们只有一个与上一条规则匹配的值。

我们必须使用以下命令捕获查询字符串

RewriteCond %{QUERY_STRING} ^(.*)$

然后使用%1将其添加回输出中

我们最终会有四行。

我知道我们要从四行开始,但是我们可以根据需要匹配任意多个参数,而不必添加第五行。

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) ?=&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ .php?%1 [L]

这将重写以下内容

/mypage/param1/val1/param2/val2/param3/val3/...     --->
/mypage.php?param1=val1&param2=val2&param3=val3&...

当仅剩一个参数时,它将停止。它将使用第一个"参数",并使用该名称调用.php文件。对参数/值对的数量没有限制。