我在.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]*)
- 第一个
/
delimeter
?([a-zA-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']
等。
答案 0 :(得分:2)
做了一些挖掘,并假设我在 Edit2 中提到的是真的,这是正确的解决方案。所以我将发布作为未来读者的答案。
^
- 字符串的开头
([a-zA-Z]*)
- 第一个
/
delimeter
?([a-zA-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)