1

我计划收到一些网址。我将使用什么 mod 重写规则对传入的 url 进行以下转换:

http://domain.com/i/ => 
http://domain.com/index.php

http://domain.com/i/b/233223/c/23333 => 
http://domain.com/index.php?b=233223&c=23333

http://domain.com/i/dd/9844kjhf/fj/djP756/ee/kjhKJH => 
http://domain.com/index.php?dd=9844kjhf&fj=djP756&ee=kjhKJH

http://domain.com/r/ => 
http://domain.com/restore.php

http://domain.com/w/place/chicago =>
http://domain.com/withold.php?place=chicago

http://domain.com/w/ =>
http://domain.com/withold.php

基本上,域之后的第一部分对应于一个页面,其余部分是一组要传递的任意数量的参数。

4

2 回答 2

3

尝试:

# If the URI is just /i/, rewrite to index.php
RewriteRule ^i/?$ /index.php [L]

# If the URI is /i/ plus some paths, rewrite the paths into query string and let rewrite engine loop
RewriteRule ^i/([^/]+)/([^/]+)(/?.*)$ /i$3?$1=$2 [L,QSA]

这将采用与内部递归限制设置的一样多的路径节点,默认情况下为 10。这意味着默认情况下,您最多可以拥有 9 组参数,除非您超出此限制。所以:

http://example.com/i/a/1/b/2/c/3/d/4/e/5/f/6/g/7/h/8/j/9

将首先匹配第二条规则,并继续循环:

1. /i/b/2/c/3/d/4/e/5/f/6/g/7/h/8/j/9?a=1
2. /i/c/3/d/4/e/5/f/6/g/7/h/8/j/9?b=2&a=1
3. /i/d/4/e/5/f/6/g/7/h/8/j/9?c=3&b=2&a=1
4. /i/e/5/f/6/g/7/h/8/j/9?d=4&c=3&b=2&a=1
etc.

直到最后你只剩下

/i?j=9&h=8&g=7&f=6&e=5&d=4&c=3&b=2&a=1

并且第一条规则得到应用,你最终应该得到:

/index.php?j=9&h=8&g=7&f=6&e=5&d=4&c=3&b=2&a=1
于 2013-04-09T18:26:50.210 回答
1

由于您的 URL 中可以有无限数量的参数,因此最好在您的应用程序中创建一个脚本来解析它们。

您可以使用 .htaccess 将所有传入请求定向到路由文件(例如 index.php )

Options -MultiViews
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,L]

然后运行​​PHP explode()之类的东西来解析 URL

于 2013-04-09T14:05:27.063 回答