Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
URL中许多未定义参数的一般重写规则_Url_.htaccess_Parameters_Mod Rewrite - Fatal编程技术网

URL中许多未定义参数的一般重写规则

URL中许多未定义参数的一般重写规则,url,.htaccess,parameters,mod-rewrite,Url,.htaccess,Parameters,Mod Rewrite,我正试图编写一个规则,使一个人可以概括,因为传递值的多个页面是不同的。现在我可以做: RewriteRule ^forum/([^/]{1,255})/([\+]{1})/((([a-z]+)([_]{1})([a-zA-Z0-9]+)([/]?))+)$ forum.php?name=$1&$5=$7 [L] 解决以下问题: Nome+del+Forum/+/page_1/action_do 应返回: forum.php?name=Nome+del+Forum&page

我正试图编写一个规则,使一个人可以概括,因为传递值的多个页面是不同的。现在我可以做:

RewriteRule ^forum/([^/]{1,255})/([\+]{1})/((([a-z]+)([_]{1})([a-zA-Z0-9]+)([/]?))+)$   forum.php?name=$1&$5=$7 [L]
解决以下问题:

Nome+del+Forum/+/page_1/action_do
应返回:

forum.php?name=Nome+del+Forum&page=1&action=do
相反,只取最后一个参数(在本例中为action=do):


我该怎么修理?提前谢谢

最简单的方法是在站点配置中添加一个。请注意,据我所知,您不能在
.htaccess
中使用
RewriteMap

如果您有权访问服务器配置文件,请在全局或
中添加类似的内容:

然后在您选择的
.htaccess
中尝试:

RewriteRule ^forum/.* ${forum:$0} [QSA]
(在您尝试的
RewriteRule
中,您似乎希望在以
forum/
开头的路径上进行匹配,所以我在这里就是这么做的。)

接下来,您需要制作
forum rewriter.pl

#!/usr/bin/perl

use strict;
use warnings;


$| = 1;
while ($_ = <STDIN>) {
    chomp($_);
    if (s,^forum/([^/]+)(/\+)?(/.*)?,forum.php?name=$1, && $3) {
        my $query_string = $3;
        $query_string =~ s,/([^/_]+)_([^/_]+),&$1=$2,g;
        $_ .= $query_string;
    }
    print "$_\n";
}
如果您不能使用
RewriteMap
,我想可以使用
mod_rewrite
,但我认为这很危险:

forum.php?name=Nome+del+Forum&action=do
RewriteCond %{ENV:SetForumName} =""
RewriteRule ^forum/([^/]+)(/\+)?(/.*)? /forum.php$3?name=$1 [QSA,E=SetForumName:1]
RewriteCond %{ENV:SetForumName} !=""
RewriteRule ^forum.php/([^/_]+)_([^/_]+)(/.*)? /forum.php$3?$1=$2 [N,QSA]
这很危险,因为当第二个
重写规则
匹配时,
[N]
会导致Apache重新开始处理所有重写规则。如果不小心,您将创建一个无限循环,Apache将响应请求或发出嘎嘎声。还要注意它设置环境变量
SetForumName
的副作用。但是,这是我能找到的唯一方法,告诉mod_rewrite“将路径中的所有
foo\u bar
替换为查询字符串中的
foo=bar
”。

类似于

有关更多信息,请参见

基本信息是这些规则

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1?%1 [L]
将重写以下内容

/mypage/param1/val1/param2/val2/param3/val3/...     --->
/mypage?param1=val1&param2=val2&param3=val3&...
它接受第一个参数并调用该页。其余参数将转换为查询字符串

使用有关代码如何工作的更多信息进行编辑

第一行(和第三行)仅捕获“?”之后的所有内容,以便可以将其添加回重写URL的末尾。同样的事情 可以使用[QSA]标志来完成,但我更喜欢这样做 显式地使其可见

字符串保存在%1变量中

第二行使用正则表达式将URL分成三部分

$2和$3是路径的最后两部分。 1美元是之前的一切

因此:

/mypage/param1/val1/param2/val2/param3/val3/param4/val4/param5/val5/
变成这样:

$1                                                        $2      $3
/mypage/param1/val1/param2/val2/param3/val3/param4/val4/  param5  val5
/mypage/param1/val1/param2/val2/param3/val3 ? param4 = val4 & param5=val5
并重写如下(为可读性添加空格):

如果URL使用斜杠以外的分隔符,则可以修改常规 相应地表达

[L](“last”)标志阻止其余规则运行。 然而——这是关键——mod_rewrite使用新的 URL和新的URL将通过mod_rewrite再次发送!这有时被称为mod_rewrite递归,这正是您所希望的

下一次通过时,接下来的两个部分将从端部剥离并添加 添加到查询字符串

这:

变成这样:

$1                                                        $2      $3
/mypage/param1/val1/param2/val2/param3/val3/param4/val4/  param5  val5
/mypage/param1/val1/param2/val2/param3/val3 ? param4 = val4 & param5=val5
这种情况会一直发生,直到URL的所有部分都转换为 查询字符串的一部分。发生这种情况时,第二行不匹配 但第四行是这样的。这就是为您提供最终URL以调用 你想要的节目。上面的链接显示了略有不同的变体的答案 这就有了不同的规则

还要注意,mod_重写的次数是有限制的 可以递归。有关详细信息,请参见设置
MaxRedirects
in.htaccess和
LimitInternalRecursion

在您的apache conf文件中。

对不起,我不明白!我不想要完整的代码,但要理解代码是如何编写的。该页面将始终是论坛,并且值之间不会用斜线分隔,而是用“u”或“:”分隔。使用此代码:它分为两部分工作,只使用第一个参数。谢谢费德里科比切杜,我补充了更多的解释。我希望这有帮助。我知道你的URL使用的是
\uuu
,而不是
/
,但是如果你使用稍微不同的正则表达式,这个概念应该同样适用。
$1                                           $2      $3     %1
/mypage/param1/val1/param2/val2/param3/val3  param4  val4 ? param5=val5
/mypage/param1/val1/param2/val2/param3/val3 ? param4 = val4 & param5=val5