Мод переписывает на apache: изменить все URL - PullRequest
1 голос
/ 19 сентября 2008

Прямо сейчас я делаю что-то вроде этого:

RewriteRule ^/?logout(/)?$ logout.php
RewriteRule ^/?config(/)?$ config.php

Я бы предпочел иметь одно правило, которое бы делало одно и то же для каждого URL, поэтому мне не нужно добавлять их каждый раз, когда я добавляю новый файл.

Кроме того, мне нравится сопоставлять такие вещи, как «/ config / new» и «config_new.php», если это возможно. Я предполагаю, что какое-нибудь регулярное выражение позволит мне выполнить это?

Ответы [ 3 ]

2 голосов
/ 19 сентября 2008

Я бы сделал что-то вроде этого:

RewriteRule ^/?(logout|config|foo)/?$ $1.php
RewriteRule ^/?(logout|config|foo)/(new|edit|delete)$ $1_$2.php

Я предпочитаю явно указывать URL-адреса, которым я хочу соответствовать, чтобы мне не приходилось беспокоиться о статическом контенте или добавлении новых вещей, которые позже не нужно переписывать в php-файлы.

Вышеприведенное допустимо, если все вложенные URL-адреса действительны для всех корневых URL-адресов (book/new, movie/new, user/new), но не очень хорошо, если вы хотите иметь разные вспомогательные URL-адреса в зависимости от действия root (logout/new не имеет особого смысла). Вы можете справиться с этим либо с более сложным регулярным выражением, либо перенаправив все в один php-файл, который будет определять, какие файлы включать и отображать на основе URL.

2 голосов
/ 19 сентября 2008

Попробуйте:

RewriteRule ^ /? (\ W +) /? $ $ 1.php

$ 1 - это содержимое первой захваченной строки в скобках. Скобки вокруг 2-го слеша не нужны.

edit: Для другого матча попробуйте это:

RewriteRule ^ /? (\ W +) / (\ w +) /? $ $ 1_ $ 2.php

1 голос
/ 19 сентября 2008

Переписывание модов не может (потенциально) выполнять безграничные замены, как вы хотите сделать во второй части вашего вопроса. Но посмотрите механизм внешнего перезаписи в нижней части Apache Руководство по перезаписи URL :

Двигатель внешнего перезаписи

Описание:

FAQ: Как мы можем решить FOO / BAR / QUUX / и т.д. проблема? Кажется, нет никакого решения с использованием mod_rewrite ... Решение:

Используйте внешнюю RewriteMap, то есть программу, которая действует как RewriteMap. Он запускается один раз при запуске Apache, получает запрошенные URL-адреса в STDIN и должен поместить полученный (обычно переписанный) URL-адрес в STDOUT (в том же порядке!).

RewriteEngine on
RewriteMap    quux-map       prg:/path/to/map.quux.pl
RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}

#!/path/to/perl

#   disable buffered I/O which would lead
#   to deadloops for the Apache server
$| = 1;

#   read URLs one per line from stdin and
#   generate substitution URL on stdout
while (<>) {
    s|^foo/|bar/|;
    print $_;
}

Это демонстрационный пример, который просто переписывает все URL / ~ quux / foo / ... в / ~ quux / bar / .... На самом деле вы можете программировать все, что захотите. Но обратите внимание, что хотя такими картами может пользоваться и обычный пользователь, его может определить только системный администратор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...