2009-12-29 2 views
0

У меня есть эти RewriteRules, которые работают отлично:mod_rewrite: как указать на другой файл, но сохранить запрос vars?

# 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] 

Теперь, я хотел бы, что если URL содержит /api/, то я хотел бы, чтобы она указывала на файл с именем public.api.php, но все еще есть те, 4 запроса вары в качестве параметров. Я мог бы организовать это путем выделения всех правил в том порядке, в котором они должны обрабатываться, но это делает довольно длинный файл .htaccess.

Мои вопросы это: есть ли способ, чтобы добавить какое-то условное правило, которое будет проверять, если /api/ в запрашиваемом Ури и в соответствии с этим, указует на index.php или public.api.php, не повторяя обработку четыре запросов варов?

ответ

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] 

Edit Вот другой подход:

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] 
0

Просто уйти? и фиксировать все параметры как одну группу?

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

могли бы вы уточнить? Я не уверен, что понимаю логику, которую вы предлагаете. – pixeline

+0

Просто скопируйте каждый параметр запроса, все из которых совпадают в одной группе, как описано в этом RewriteRule выше, что, по общему признанию, не проверено. – fforw

+0

Ваш regexp все не избежать? что означает «любой символ один раз» в регулярном выражении. – fforw

Смежные вопросы