Недавно мы унаследовали некоторый код, и я просматриваю файл .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
что имеет больше смысла и согласуется с тем, что показывает документация Вот. Итак, в приведенном выше примере у меня есть следующие вопросы:
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.
\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:
Это правило предназначено для переадресации соединений, отличных от HTTP, на соединения HTTPS. Так:
^on
используется для проверки «НЕ активен ли HTTP». ^
означает отрицательное совпадение.%
знак относятся к RewriteCond
регулярные выражения. В таком случае, %1
относится к (s)
группа захвата, и поэтому %1
является s
когда HTTP не активен.Как это RewriteRule
было написано немного слишком сложно, я думаю, что мог бы быть более простой способ реализовать его. Однако он делает то, для чего предназначен.
Пример 2:
\s
соответствует пустому пространству. Итак, это RewriteRule соответствует /index.php
, то есть пробел после .php
. Я думаю что второй RewriteCond
делает это правило неработающим вообще, если какая-то часть программного обеспечения веб-сайта не генерирует неправильные URL-адреса.Пример 3:
.
просто соответствует любой строке, а index.php
используется замена. Критерии соответствия в этом RewriteRule
нет необходимости быть более конкретным, так как любой несуществующий URL-адрес отправляется на index.php
.