.htaccess разница в регулярных выражениях / плюсы / минусы - PullRequest
14 голосов
/ 13 февраля 2012

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

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

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

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

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

1 Ответ

33 голосов
/ 13 февраля 2012

Допустим, у нас есть этот .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-адресе, которые вам нужно будет проверить в вашем скрипте.

Пример: =@*-+

([^.] +)

  • []: соответствует любому символу в квадратных скобках
  • [^]: соответствует любому символу, кромеуказан в фигурных скобках ( 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 will be file1.html

и если у вас 2:

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

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

См. Тест производительности: .htaccess mod_rewrite производительность

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

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