扩展URL重写规则以包含更多参数

时间:2016-02-14 15:05:35

标签: regex apache .htaccess mod-rewrite

我在.htaccess中使用以下mod_rewrite 处理HOSTNAME/controller/action/id

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&id=$3 [NC,L]

我想更改它,以便url可以包含更多这样的参数:

HOSTNAME/controller/action/arg1/arg2/arg3

index.php?controller=$1&action=$2&arg1=$3&arg2=$4&arg3=$5

我知道这涉及到更改前面的正则表达式,但是,我不理解正则表达式,并试图在mod rewrite generator上进行,这看起来很简单,但我仍然无法让它工作。

编辑此外,有人可以打破这个特定正则表达式的部分,所以帮助初学者了解什么是什么。

EDIT2

在研究正则表达式模式并进行一些搜索之后,我想到了以下内容:

^ - 字符串的开头

([a-zA-Z]*) - 第一个

之前的a-Z字符串

/ delimeter

?([a-zA-Z]*)? - 在第一个之后但在第二个

之前的a-Z字符串

/ delimeter

?([a-zA-Z0-9]*)? a-9字符串在第2个之后,但在第3个

之前

/ delimeter

?$ - 按顺序将每个变量放入$变量?

无论如何,我会尝试根据这个理论添加额外的2个参数,并发布我的结果。

EDIT3

在我自己发现解决方案并实施arkascha提供的解决方案之后。我决定接受arkascha's answer作为一种更好,更灵活的方式来处理url中的多个参数。但是,您必须通过$path数组中的索引来引用它们。

相反,如果您知道您将仅使用固定或最大数量的参数,则可以使用我的解决方案。使用此功能,您还可以将URL元素称为$_GET['controller'], $_GET['action'] $_GET['arg1']等。

2 个答案:

答案 0 :(得分:2)

做了一些挖掘,并假设我在 Edit2 中提到的是真的,这是正确的解决方案。所以我将发布作为未来读者的答案。

^ - 字符串的开头

([a-zA-Z]*) - 第一个

之前的a-Z字符串

/ delimeter

?([a-zA-Z]*)? - 在第一个之后但在第二个

之前的a-Z字符串

/ delimeter

?([a-zA-Z0-9]*)? a-9字符串在第2个之后,但在第3个

之前

/ delimeter

?$ - 按顺序将每个变量放入$变量

所以只需像这样扩展url重写就可以了:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?([a-zA-Z0-9]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&arg1=$3&arg2=$4&arg3=$5 [NC,L]

答案 1 :(得分:0)

如上所述,我建议只在http服务器重写模块内部进行一些基本的重写。这有点像使用nginx http服务器时通常实现的策略。这样可以灵活地在php引擎中实现额外的请求处理。此外,您不必修改您的重写模式。

显然,确切的模式取决于请求,这只是一个基本的例子:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_URI} !^/css
RewriteRule ^.*$ index.php [L]

现在,您可以进一步检查php脚本中的实际请求:

<?php
$request = parse_url($_SERVER['REQUEST_URI']);
var_dump([
  'path' => explode('/', $request['path']),
  'args' => explode('&', $request['query']),
]);

https://example.org/controller/action/arg1/arg2?foo=bar的请求将提供该输出:

array (size=3)
  'path' => 
    array (size=5)
      0 => string '' (length=0)
      1 => string 'controller' (length=10)
      2 => string 'action' (length=6)
      3 => string 'arg1' (length=4)
      4 => string 'arg2' (length=4)
  'args' => 
    array (size=1)
      0 => string 'foo=bar' (length=7)