Мод-перезаписывается на apache:измените все URL-адреса
-
01-07-2019 - |
Вопрос
Прямо сейчас я делаю что-то вроде этого:
RewriteRule ^/?logout(/)?$ logout.php
RewriteRule ^/?config(/)?$ config.php
Я бы предпочел иметь одно правило, которое делало бы одно и то же для каждого URL-адреса, поэтому мне не нужно добавлять их каждый раз, когда я добавляю новый файл.
Кроме того, мне нравится сопоставлять такие вещи, как '/config/new' с 'config_new.php', если это возможно.Я предполагаю, что какое-нибудь регулярное выражение позволит мне выполнить это?
Решение
Попробуй:
RewriteRule ^/?(\w+)/?$ $1.php
$ 1 - это содержимое первой захваченной строки в квадратных скобках.Скобки вокруг 2-й косой черты не нужны.
Редактировать:Для другого матча попробуйте следующее:
RewriteRule ^/?(\w+)/(\w+)/?$ $1_$2.php
Другие советы
Я бы сделал что-то вроде этого:
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.
Mod rewrite не может выполнять (потенциально) безграничные замены, как вы хотите сделать во второй части вашего вопроса.Но посмотрите на внешний механизм перезаписи в нижней части страницы. Руководство по переписыванию URL-адресов Apache:
Внешний механизм перезаписи
Описание:
Часто задаваемые вопросы:Как мы можем решить проблему FOO / BAR / QUUX / etc.проблема?Похоже, что нет решения с помощью mod_rewrite...Решение:
Используйте внешнюю карту перезаписи, т.е.программа, которая действует как карта перезаписи.Он запускается один раз при запуске Apache, получает запрошенные URL-адреса в STDIN и должен поместить полученный (обычно переписанный) URL-адрес в СТАНДАРТНЫЙ вывод (в том же порядке!).
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/бар/....На самом деле вы можете программировать все, что вам нравится.Но обратите внимание, что, хотя такие карты могут использоваться и обычным пользователем, определить это может только системный администратор.