Arrays Htaccess:多个参数和嵌套括号
我有一个项目,我在Arrays Htaccess:多个参数和嵌套括号,arrays,.htaccess,mod-rewrite,Arrays,.htaccess,Mod Rewrite,我有一个项目,我在index.php上重定向每个请求,使用各种GET参数 目前,我正在使用这种htaccess(这只是一个摘录,为了简化问题,我将参数名称改为a、b、c…): 它可以工作(很好),但我正在考虑一种方法,将这些行缩小为一行。 这个想法是使用一些嵌套的圆括号来“生成”所有获取参数,但它似乎不像我想的那么容易 以下是我迄今为止所做的: RewriteRule ^(?:([\w-]+)\/)*([\w-]+)\.html$ index.php?a=$1&b=$
index.php
上重定向每个请求,使用各种GET
参数
目前,我正在使用这种htaccess(这只是一个摘录,为了简化问题,我将参数名称改为a、b、c…
):
它可以工作(很好),但我正在考虑一种方法,将这些行缩小为一行。
这个想法是使用一些嵌套的圆括号来“生成”所有获取参数,但它似乎不像我想的那么容易
以下是我迄今为止所做的:
RewriteRule
^(?:([\w-]+)\/)*([\w-]+)\.html$
index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L]
获取url的结果http://website.com/1/2/3/4/5/6/7/8/9.html
:
array(9) {
["a"]=> string(1) "8"
["b"]=> string(1) "9"
["c"]=> string(0) ""
["d"]=> string(0) ""
["e"]=> string(0) ""
["f"]=> string(0) ""
["g"]=> string(0) ""
["h"]=> string(0) ""
["i"]=> string(0) ""
}
而不是获取a=1
,b=2
,c=3
。。。我只收到最后两个参数。请注意,执行了重写规则
,然后我知道我的正则表达式匹配
<记录>:< P>记录:考虑使用基于PHP的方法:将整个请求的URI传递给PHP,然后您可以在PHP中处理整个事情,这比用MODE重写做魔术更容易,更可能更安全,甚至更快。p>
我的意思是这样的:
RewriteRule ^(.*)\.html$ switchboard.php?uri=$1 [L]
然后在switchester.php中:
list($_GET['a'], $_GET['b'], $_GET['c']) = explode( '/', $_GET['uri']);
require 'index.php';
(如果超长列表()看起来很麻烦,可以使用一些巧妙的单行映射技术)
无论如何,正则表达式问题当然很有趣,但它是一个通用的PCRE问题。这种现象被称为“重复捕获组”:每当你像你一样用Kleene星重复一个捕获组时,实际上只会捕获最后一次迭代(在我们的例子中,匹配1,2..7被丢弃,只有8被保留)-将它想象为一个缓冲区,你不断用更新的匹配覆盖它。如果你仔细想想,这很有道理
一个解决方案是使用您实际想要捕获的任意多个组,方法是将以前的组设置为可选的-编写和读取非常困难(事实上,Arjan刚刚发布了它,仅仅看一下它就令人头疼),而且在这种情况下效率也非常低。一个更简单的解决方案是捕获整个内容并将其拆分
RewriteRule
^([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+))?)?)?)?)?)?)?)?\.html$
index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L]
未经测试,但我认为这符合你的要求。请注意,它适用于1到9个参数,至少需要一个。
还请注意,原始url中存在的任何GET参数都可以通过这种方式删除。您试图解决的真正问题是什么?使用正则表达式并不总是最好的解决方案。我用粗体字表示:使用单个重写规则而不是9来完成相同的工作。在这种情况下,我并不真正关心性能,这更像是一个好奇的问题。因此,基本上你想知道是否有可能编写一个正则表达式来将url转换成一个有很多GET参数的东西。这应该是可能的,但也意味着您正在删除在原始url上指定的任何GET参数。这意味着它并不适用于任何项目。它已经删除了任何GET
参数,但我只使用重写的URL,所以我肯定不会有任何问题。我只是在寻找一种更简短的方法来写我的规则,没有了。很有趣。。。感谢你为我的问题命名,我发现了一篇详细的文章:你,没有可能捕捉到每个组,写一行规则变得很尴尬!正如@Sat所说,这个解决方案很难看:)不管怎样,这是一个有效的单线解决方案,所以你得到了我的投票。谢谢你们两位的解释。这个解决方案很难看,这就是为什么我第一次想知道它真的是你想要的。
RewriteRule
^([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+))?)?)?)?)?)?)?)?\.html$
index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L]