URL重写不能按预期使用多个参数

时间:2015-10-12 20:30:04

标签: regex .htaccess url mod-rewrite url-rewriting

我想沿着这些线创建一个干净的网址     http://example.com/secretkey/username/apifunction/data_in/

并使用以下网址重写规则,它似乎工作正常

$('table').focusin(function (e) {
    console.log("table got focus - scroller jumps up");
}).click(function () {
    $('table').setActive();
});

因为我从网址重写测试程序获得以下输出确认。

RewriteRule ^/?([^-]+)/([^-]+)/([^-]+)/([^-]+)/?$ /api.php?Key=$1&user=$2&funct=$3&request=$4 [L,QSA]

然而它似乎摔倒了,而我正在努力理解的部分是如果我在URL的末尾添加额外的/ moredata /它就会崩溃。并且url重写测试程序显示我的url现在返回如下。

http://example.com/api.php?Key=secretkey&user=username&funct=apifunction&request=data_in

任何关于我出错的建议都会非常感激,并且我的重写中出现了任何突出的错误(这对我来说都是新的)。

2 个答案:

答案 0 :(得分:1)

[^-]+表示匹配,直到找到下一个-或行结束。但在您的情况下,您实际上是在匹配由/分隔的网址组件。

请尝试使用此代码:

RewriteEngine On
RewriteBase /apitest/

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ api.php?Key=$1&user=$2&funct=$3&request=$4 [L,QSA]

答案 1 :(得分:0)

造成这种行为的两个关键因素是:

  1. 您的正则表达式分组为([^-]+),表示:"匹配除-字符以外的任何内容"
  2. 默认情况下,正则表达式匹配是贪婪的,这意味着它将尽可能多地匹配。
  3. 这意味着您的第一个分组([^-]+)匹配路径元素和/。如果你真的想要匹配除-个字符以外的所有内容,那么除了结尾之外的所有内容中都包含/

    RewriteRule ^/?([^-/]+)/([^-/]+)/([^-/]+)/([^-]+)/?$ /api.php?Key=$1&user=$2&funct=$3&request=$4 [L,QSA]