mod_rewrite:如何指向不同的文件,但保留查询变量?

时间:2009-12-29 10:27:57

标签: php .htaccess mod-rewrite

我有这些rewriteRules工作正常:

# 4 params
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2&what=$3&id=$4 [NC,L,QSA]

# 3 params
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2&what=$3 [NC,L,QSA]

# 2 params
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2 [NC,L,QSA]

# 1 param
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?app=$1 [NC,L,QSA]

现在,我希望如果网址包含/api/,那么我希望它指向一个名为public.api.php的文件,但仍然将这4个查询变量作为参数。 我可以通过按照处理顺序排列所有规则来安排,但它会产生一个相当冗长的.htaccess文件。

我的问题是:有没有办法添加某种条件规则来检查/api/是否在请求的uri中,并根据此指向index.php或{{1}不重复处理四个查询变量?

2 个答案:

答案 0 :(得分:1)

最简单的方法是添加一些规则,如:

RewriteRule ^api/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ public.api.php?app=$1&do=$2&what=$3&id=$4 [NC,L,QSA]
RewriteRule ^api/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ public.api.php?app=$1&do=$2&what=$3 [NC,L,QSA]
RewriteRule ^api/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ public.api.php?app=$1&do=$2 [NC,L,QSA]
RewriteRule ^api/([A-Za-z0-9-]+)/?$ public.api.php?app=$1 [NC,L,QSA]

修改以下是另一种方法:

RewriteRule (^|.+?/)api/?([^/].*)?$ $1$2

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2&what=$3&id=$4 [NC,L,QSA]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2&what=$3 [NC,L,QSA]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?app=$1&do=$2 [NC,L,QSA]
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?app=$1 [NC,L,QSA]

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?\ ]+/)?api/?
RewriteRule ^index\.php$ public.api.php [L]

答案 1 :(得分:0)

逃避?并将所有参数作为一组捕获?

RewriteRule ^.*/api/.*\?(.*)$ /public.api.php?$1 [NC,L,QSA]