2010-10-26 5 views
2

Я пишу правило mod_rewrite и хотел бы, чтобы рука делала то, что я хочу.Регулярное выражение соответствует любому, что не начинается с определенной строки

В основном я хочу следующие случаи работы:

request | Redirect to 
--------------------- 
cheese | /?page=cheese 
abc123 | /?page=abc123 
abc/def | /?page=abc/def 
a/b/c/d | /?page=a/b/c/d 

(. Любой буквенно-цифровой плюс -/и _ перенаправлены)

С двух специальных случаях:

request | Redirect to 
------------------------ 
admin | don't redirect 
media | don't redirect 

С помощью этих двух Я не хочу, чтобы любые вспомогательные каталоги и т. Д. Перенаправляли либо.

Я дошел до:

RewriteRule ^([A-Za-z0-9-_]+)/$ /index.php?page=$1 [L] 

Но это только удовлетворяет два верхних испытания.

Любые идеи?

ответ

2

Я бы создал отдельное ранее правило (как предположил Коби) и используйте RewriteRule dash directive для предотвращения замещения.

Прочерк указывает на то, что ни одна замена не должна быть выполнена (существующий путь пропускают через нетронутым). Это значение используется, когда для изменения флага (см. Ниже) необходимо использовать без изменения пути.

^index.php - [L] 
^(admin|media) - [L] 
^([A-Za-z0-9-_/\.]+)$ /?page=$1 [L] 

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

Испытано на Apache 2.2


EDIT: Был в состоянии попробовать это сейчас - нужно добавить [L], чтобы заставить его работать.
EDIT2: Реализованный Я не ответил на весь вопрос, добавил правила для остальной части материала.

+0

Прохладный - не знал про тире! Кажется, что посещение/admin/не идет на то же место, что и /admin/index.php (он делает без каких-либо правил перезаписи ...) –

+0

Где находится/admin/going? У вас есть index.html и index.php, находящиеся под/admin? Если вы это сделаете, и index.html появится перед индексом.php в директиве конфигурации Apache DirectoryIndex, что может вызвать проблемы. –

1

Если ваша версия поддерживает его, вы можете использовать отрицательный предпросмотр:

^(?!(?:admin|media)$)([A-Za-z0-9-_]+)/$ 

Теперь, я не системный администратор, но вы, вероятно, может иметь ранее правила, чтобы соответствовать admin и media, который вероятно, более простая идея.

+0

Похоже, вы можете, в зависимости от версии: [Regex negative look-ahead не работает для mod_rewrite между различными версиями Apache] (http://serverfault.com/q/120971/2454) – Kobi

+0

О, я также хочу для отказа от 'adminACB', просто удалите знак' $ 'из lookahead:' (?! admin | media) ' – Kobi

+0

Мне это нравится, хотя я собираюсь пойти с другим ответом, поскольку я думаю, что он более удобен в обслуживании с течением времени продолжается. Большое спасибо! –

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