我一直在阅读以前的解决scheme ,以recursionmod_rewrite问题是类似于我想要做的,不同的是我发送所有查询通过index.php文件,所以不需要指定查询内的脚本。
本质上,我想在search引擎友好的url中recursion地转换任何数量的参数:
example.com/param1/val1/param2/val2/...
到一个普通的查询string:
example.com/index.php?param1=val1¶m2=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 。