Мод-перезаписывается на apache:измените все URL-адреса

StackOverflow https://stackoverflow.com/questions/104487

  •  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/бар/....На самом деле вы можете программировать все, что вам нравится.Но обратите внимание, что, хотя такие карты могут использоваться и обычным пользователем, определить это может только системный администратор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top