(Apache Mod_Rewrite) Пожалуйста, помогите сжать мой запрос - PullRequest
4 голосов
/ 05 ноября 2011

Я пытаюсь написать набор правил mod_rewrite для выполнения следующих условий:

1) /aaa  (redirects to) --> /xxx_aaa.php
2) /aaa/                --> /xxx_aaa.php
3) /aaa?w=x&y=z         --> /xxx_aaa.php?w=x&y=z
3) /aaa/?y=z            --> /xxx_aaa.php?y=z
4) /aaa/bbb/            --> /xxx_aaa_bbb.php
5) /aaa/bbb/ccc/        --> /xxx_aaa_bbb_ccc.php
6) /aaa/bbb/cc12-34cc   --> /xxx_aaa_bbb_cc12-34cc.php
7) /aaa/bbb/ccc/?y=z    --> /xxx_aaa_bbb_ccc?y=z.php

Приведенный выше список не является исчерпывающим, но он дает вам представление обо всех возможных перестановках, к которым я стремлюсьпокрывать.А именно, это:

1) До трех уровней подкаталогов
2) Работает независимо от того, присутствует ли закрывающая косая черта
3) Передать строки запроса GET, если есть

Это то, что я сейчас использую:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteRule ^([0-9a-zA-Z\-]+)$ /xxx_$1.php [L]
RewriteRule ^([0-9a-zA-Z\-]+)/$ /xxx_$1.php [L]
RewriteRule ^([0-9a-zA-Z\-]+)/\?([0-9a-zA-Z\-=&]+)$ /xxx_$1.php?$2 [L]

RewriteRule ^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)$ /xxx_$1_$2.php [L]
RewriteRule ^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)/$ /xxx_$1_$2.php [L]
RewriteRule ^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)/\?([0-9a-zA-Z\-=&]+)$ /xxx_$1_$2.php?$3 [L]

RewriteRule ^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)$ /xxx_$1_$2_$3.php [L]
RewriteRule ^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)/$ /xxx_$1_$2_$3.php [L]
RewriteRule ^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-]+)/\?([0-9a-zA-Z\-=&]+)$ /xxx_$1_$2_$3.php?$4 [L]

И, кажется, это работает просто отлично.

Но я не могу не думать, что должен быть гораздо более элегантный способделая это - возможно, даже объединяя все вышеперечисленное в одну строчку.

Есть идеи?Любая помощь высоко ценится, спасибо.:)

1 Ответ

6 голосов
/ 05 ноября 2011

Примерно так:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^([0-9A-Z\-]+)/?$ /xxx_$1.php [L,QSA,NC]
RewriteRule ^([0-9A-Z\-]+)/([0-9A-Z\-]+)/?$ /xxx_$1_$2.php [L,QSA,NC]
RewriteRule ^([0-9A-Z\-]+)/([0-9A-Z\-]+)/([0-9A-Z\-]+)/?$ /xxx_$1_$2_$3.php [L,QSA,NC]

NC = не регистр, поэтому AZ = az

QSA = строка запроса append =? W = x & y = z (например, $ _GET ['w'] в PHP)

...