.htaccess регулярное выражение разницы/плюсы/минусы

У меня есть куча правил в моем .htaccess(поддоменах, папках, папках с конкретными пользователями и т.д.)

и теперь я использую это регулярное выражение:

([a-z0-9A-Z])

Я искал конкретное правило, и я нашел несколько способов его создания, и мне было интересно если для них существует стандартная практика? в чем разница/плюсы/минусы использования чего-то вроде:

  • ([^.]+)
  • ([^/]+)
  • (.*)
  • ([a-z0-9]+)

Ответы

Ответ 1

Скажем, у нас есть этот .htaccess:

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L]

Выражение, указанное в вашем вопросе, будет иметь следующую логику:

^ (. *) $

  • .: соответствие любому символу и любому одиночному символу
  • *: совпадение нуля или более предыдущего символа

В основном это будет соответствовать:

  • folder1/file1.html: $1 будет folder1/file1.html
  • file1.html: $1 будет file1.html

Таким образом, очень просто разобрать весь запрос в PHP или Python. С другой стороны, вы не фильтруете никаких нежелательных символов в URL-адресе, который вам нужно будет проверить в script.

Пример: [email protected]*-+

([^.] +)

  • []: соответствует любому из символов внутри квадратных скобок
  • [^]: сопоставить любой символ, отличный от того, что указано внутри фигурных скобок (ref).
  • +: сопоставить один или несколько предыдущих символов
  • [^.]: совпадение с символом .. Будет прекращено совпадение, если будет найден символ .

От ref.

Единственными специальными символами или метасимволами внутри класса символов являются закрывающая скобка (]), обратная косая черта(), каретка (^) и дефис (-). Обычные метасимволы являются нормальными символами внутри символьного класса и не требуют экранирования обратной косой черты. Для поиска звезды или плюс используйте [+ *]. Ваше регулярное выражение будет работать нормально, если вы избежите регулярных метасимволов внутри класса символов, но это значительно уменьшает читаемость.

В основном это будет соответствовать:

  • folder1/file1.html: $1 будет folder1/file1
  • file1.html: $1 будет file1

Это как тот же эффект, что и первый, кроме этой полосы, все после точки .

^ ([^/] +) $

  • []: соответствует любому из символов внутри квадратных скобок
  • +: сопоставить один или несколько предыдущих символов
  • ^: соответствие началу строки
  • [^/]: совпадение с символом /. Будет прекращено совпадение при обнаружении символа /

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

В основном это будет соответствовать чему угодно (если у вас есть только один набор):

  • folder1/file1.html: $1 будет folder1
  • file1.html: $1 будет file1.html

и если у вас есть 2:

  • folder1/file1.html: $1 будет folder1, а $2 будет соответствовать file1.html
  • file1.html: $1 будет file1.html

Чем больше папок у вас есть, тем больше вы можете добавить правило.

^ ([a-z0-9] +) $ [ ^ ([a-z0-9.] +) $ для этого примера]

  • []: соответствует любому из символов внутри квадратных скобок
  • +: сопоставить один или несколько предыдущих символов
  • a-z: сопоставить буквы от a до z
  • 0-9: номера совпадений от 0 до 9

(Вы также можете использовать \d или\w)

В основном это будет соответствовать чему угодно (если у вас есть только один набор - добавлена ​​точка):

  • folder1/file1.html: $1 будет folder1
  • file1.html: $1 будет file1.html

и если у вас есть 2:

  • folder1/file1.html: $1 будет folder1, а $2 будет соответствовать file1.html
  • file1.html: $1 будет file1.html

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

См. контрольный показатель: .htaccess mod_rewrite performance

Итак, если вы знаете, какой тип запроса вы получите, вы всегда сможете использовать последний, но если вы не уверены, вам придется выбрать тот, который больше подходит вам. Там может быть больше разницы между всеми из них, но основная цель понимания этого регулярного выражения заключается в том, чтобы понять, что они делают или ловят. Кроме того, производительность - это то, что вам нужно принять во внимание. Согласование всего, а затем синтаксический анализ запроса на PHP или Python может занять больше времени, чем просто сопоставить их поначалу и просто использовать их в script.