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¶m2=val2¶m3=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