Назад | Перейти на главную страницу

Некоторое уточнение синтаксиса mod_rewrite

Недавно мы унаследовали некоторый код, и я просматриваю файл .htaccess одного из сайтов. Я понимаю, каков конечный результат большинства наборов правил перезаписи, я просто не уверен в некотором синтаксисе. Справочная информация: CentOS 7 с Apache 2.4, под управлением Concrete5 CMS.

Пример 1:

RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Я понимаю, что% {HTTPS} - одна из специальных переменных, предоставляемых mod_rewrite, которая оценивается как on или off. В предыдущем правиле я вижу RewriteCond %{HTTPS} =on что имеет больше смысла и согласуется с тем, что показывает документация Вот. Итак, в приведенном выше примере у меня есть следующие вопросы:

  1. Что означает завершающая буква s в% {HTTPS} s
  2. Почему в шаблоне используется ^ on вместо = on. Это действительно так?
  3. Я понимаю, что на все, что указано в скобках, можно ссылаться с помощью% 1, но это размещение здесь для меня не имеет смысла. Если% {HTTPS} будет оценивать on или off, затем размещение (я) | in Pattern заставит его никогда не соответствовать условию, верно? А для чего ТРУБА?

Пример 2:

#redirect calls to index.php without get parameters to non-www
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{THE_REQUEST} /index\.php\s [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]

Я не совсем понимаю второй RewriteCond.

  1. Что \s что делать в конце index.php?

Пример 3:

Наконец, у нас есть

#Standard C5 pretty urls
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}/index.html !-f 
RewriteCond %{REQUEST_FILENAME}/index.php !-f 
RewriteRule . index.php [L]

В RewriteRule шаблон . что в регулярном выражении означает «любой символ».

  1. Говорит ли это правило: «Если вышеуказанные условия выполнены, замените любой символ на index.php»? Что делает это правило?

Пожалуйста, проигнорируйте этот ответ, он во многих отношениях неверен.

Пример 1:

Это правило предназначено для переадресации соединений, отличных от HTTP, на соединения HTTPS. Так:

  1. Завершающие s предназначены для SSL.
  2. ^on используется для проверки «НЕ активен ли HTTP». ^ означает отрицательное совпадение.
  3. Ссылки с % знак относятся к RewriteCond регулярные выражения. В таком случае, %1 относится к (s) группа захвата, и поэтому %1 является s когда HTTP не активен.

Как это RewriteRule было написано немного слишком сложно, я думаю, что мог бы быть более простой способ реализовать его. Однако он делает то, для чего предназначен.

Пример 2:

  1. В \s соответствует пустому пространству. Итак, это RewriteRule соответствует /index.php, то есть пробел после .php. Я думаю что второй RewriteCond делает это правило неработающим вообще, если какая-то часть программного обеспечения веб-сайта не генерирует неправильные URL-адреса.

Пример 3:

  1. Это означает: «Если вышеуказанные условия соблюдены, замените любую строку в URL-адресе на index.php». В . просто соответствует любой строке, а index.php используется замена. Критерии соответствия в этом RewriteRule нет необходимости быть более конкретным, так как любой несуществующий URL-адрес отправляется на index.php.