apache mod_rewrite适用于任何可能性的规则

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache mod_rewrite适用于任何可能性的规则相关的知识,希望对你有一定的参考价值。

我正在建立一个相当大的网站,我的.htaccess开始感觉有点膨胀,有没有办法取代我现有的系统 - 每个可能通过的可能数量的变量的一个规则,一个捕获所有可以解释不同数量输入的表达式?

例如,我目前有:

RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4&$5=$6
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4
RewriteRule ^([a-z]+)/([^/]*)$ /index.php?mode=$1&id=$2
RewriteRule ^([a-z]+)$ /index.php?mode=$1

第一个反向引用始终是模式,并且(如果存在的话)第二个反向引用总是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=$1 [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++;
    }
}
另一答案

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

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

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

继续将输入查询字符串添加到输出。每次通过,您的查询字符串将变得更长,您的URL将变得更短。

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

您必须使用捕获查询字符串

RewriteCond %{QUERY_STRING} ^(.*)$

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

你最终会得到四条线。

我知道您开始使用四行,但您可以根据需要匹配任意数量的参数,而无需添加第五行。

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

这将重写以下内容

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

当只剩下一个参数时停止。它将采用第一个“参数”并使用该名称调用.php文件。 param / val对的数量没有限制。

另一答案

我不相信他们是一种方式 - 但我会说你最好的选择是让脚本“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

会让你的$模式为'foo'而$ path是一个包含'bar'和'baz'的数组

以上是关于apache mod_rewrite适用于任何可能性的规则的主要内容,如果未能解决你的问题,请参考以下文章

mod_rewrite 适用于 .htaccess 文件,但不适用于 apache2.conf

Apache mod_rewrite 适用于 .htaccess 但不适用于 httpd.conf

.htaccess 适用于 Apache 服务器,但不适用于 FTP 目录

.htaccess 适用于 Apache 服务器,但不适用于 FTP 目录

apache tomcat + apache httpd + mod_proxy + mod_rewrite + 表单发布数据

如何在任何操作系统上启用 mod_rewrite?