recursionmod_rewritesearch引擎友好的url

我一直在阅读以前的解决scheme ,以recursionmod_rewrite问题是类似于我想要做的,不同的是我发送所有查询通过index.php文件,所以不需要指定查询内的脚本。

本质上,我想在search引擎友好的url中recursion地转换任何数量的参数:

example.com/param1/val1/param2/val2/... 

到一个普通的查询string:

 example.com/index.php?param1=val1&param2=val2&... 

到目前为止,我在尝试中还是没有成功,

 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^([^/]+)/([^/]+) $1=$2&%1 [L] RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)$ index.php?%1 [L] 

任何人都可以提供任何build议吗?

我复制了另一个问题的解决方案,并像这样修改它:

 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*/)?([^/]+)/([^/]+) $1?$2=$3&%1 [L] RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^.*$ index.php?%1 [L] 

它几乎是一样的,除了在第一条规则中,第一个匹配是可选的,而在第二条规则中,匹配是所有其他匹配后剩下的任何内容。

对于奇数个参数,第一个参数被忽略。

一个注意,如果你期望有很多的参数,你可能需要改变一些设置。

把这样的东西添加到你的.htaccess文件中

 RewriteOptions MaxRedirects=20 

和类似这样的你的apache conf文件

 LimitInternalRecursion 20 

而不是“20”选择任何数量的递归(对)你需要允许(默认是10)。

我明白这是一个非常古老的线索。 但是因为这里发布的答案都没有为我工作,我想发布我的答案,以便游客可以使用它,如果他们想,所以我在这里回答:

 Options +FollowSymlinks -MultiViews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/([^/]+)(/.*)?$ $3?$1=$2 [N,QSA,DPI] RewriteRule ^(/[^/]+|[^/]+/|/?)$ /index.php [L,QSA,DPI] 

有关更多详细信息,请参阅MOD_REWRITE上对URL变量的回答,删除空参数,并为第一个和第二个变量使用多个1字段

是…

从这里的例子看:

http://iirf.codeplex.com/sourcecontrol/changeset/view/62027?projectName=IIRF#981491

该规则集迭代地将一对URL路径段转换为查询字符串n = v段。

 # handle case with no query string. This rule fires the first time through, # and converts the first pair of URL path segments to an=v query string segment. RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)/([^\?]+)$ /$3?$1=$2 # handle the case where there is an existing query string, and more than one pair of # URL path segments remaining. This rule fires potentially multiple times. RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)/([^\?]+)\?(.+)$ /$3?$4&$1=$2 # Handle the case with a query string, and exactly one pair of URL path segments. # This fires once (last). # It fires when there is an even number of segments. RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)\?([^\?]+)$ /help.cfm?$3&$1=$2 [L] # Handle the case with no query string, and exactly one pair of URL path segments. # This fires once (last). RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)$ /help.cfm?$1=$2 [L] # Handle the edge case, where there is an odd number of segments, which is invalid # for these purposes. # # This fires once, after all the other pairs have been parsed. In fact the filter # cannot know that there is an odd number of segments until it does all the matching. # So at the end we see, we have one left over segment, and we # redirect to a 404 page. RewriteRule ^/(?!index\.php)([^\/\?]+)\?([^\?]+)$ /ResourceNotFound.php [L] # Handle the edge case where there is only one segment. This is also an error # in this ruleset. RewriteRule ^/(?!index\.php)([^\/\?]+)$ /FoundOnlyOneSegment.php [L] 

这个规则集可能不是你想要的,但它说明了这个方法。 它不是为mod_rewrite开发的,而是针对IIRF的,它是IIS的重写器。 但是mod_rewrite的语法应该是一样的,所以这些规则应该可以工作。

我不知道mod_rewrite是否具有日志记录工具或命令行测试功能,但是IIRF 可以 ,这使得查看单个规则如何工作或规则集的结果更容易。

IIRF有一个默认为10的迭代限制。有一种方法可以将这个限制提高到30,这个数字相当高,但仍然不是无限的。 这意味着它不适用于“任何数量的参数”。 它可以转换多达15对params。 我不知道mod_rewrite是否有类似的限制。

试试这些规则:

 RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L] RewriteRule ^([^/]+)/([^/]+)(/(.*))?$ /$4?$1=$2 [N,QSA] RewriteRule ^$ index.php [L] 

第一条规则是排除对现有文件的请求。 第二条规则将完成工作并重写每个名称和值对。 第三个规则是将最终的URI重写为index.php