Apple & Onion: Dollar Store Dash - Можете ли да оцелеете в Черен петък? (CN Games)

Ето пример от документацията на Apache за налагане на канонични имена на хостове:

RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^/?(.*) http://www.example.com/$1 [L,R,NE] 

Това, което бих искал да знам, е защо /? е необходимо. Опитах се да го премахна и изглежда всичко работи по същия начин. Бях с впечатлението, че частта от шаблона на правилото за пренаписване е сравнена с това, което идва след наклонената черта.

Низът {REQUEST_URI} започва с / символ. Apache промени двигателите на регулярни изрази, когато промени версиите, така че Apache версия 1 изисква водещата наклонена черта, докато Apache 2 го забранява! Можем да задоволим и двете версии, като направим водещата наклонена черта незадължителна с израза ^ /? (? е метасимволът за нула или един от предходния знак).

Източник: http://www.sitepoint.com/apache-mod_rewrite-examples/

Още няколко източника, които говорят за водещата наклонена черта

http://forum.modrewrite.com/viewtopic.php?f=4&t=4627

и http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/

  • Но документацията на Apache 2.2 има множество примери с водещ ^ /. Напр. раздел RewriteCond има: RewriteRule ^/$ /homepage.std.html [L]. Това грешка в документацията ли е?
  • Оказва се (както току-що тествах), че водещият / (^ /) се изисква, поне в контекста на VirtualHost. Не съм тествал други контексти.

Наскоро се случи сам с този проблем. Има разлика между използването RewriteRule във VirtualHost и като част от .htaccess файл. Следното правило ще съответства (с URL адрес като този: example.com/fruit/apple), ако се появи във файл .htaccess:

RewriteRule ^(fruit|fruits)/apple http://newfruitwebsite.com$1 [R=301,L] 

но няма да съвпада в контекста на VirtualHost. Ако разгледаме документите на apache, можем да видим, че:

Когато използвате механизма за пренаписване в .htaccess файлове, префиксът за всяка директория се премахва автоматично за съответствието на модела RewriteRule и автоматично се добавя, след като всяка роднина (не започваща с наклонена черта или име на протокол) замени края на набор от правила.

... но какво означава това? Горното правило няма да съответства на същия URL адрес, ако е бил поставен във VirtualHost, защото не позволява водеща наклонена черта (/), за да бъде в началото на низа. Документите на apache продължават да казват:

Премахнатият префикс винаги завършва с наклонена черта, което означава, че съвпадението се извършва спрямо низ, който никога няма водеща наклонена черта. Следователно, шаблон с ^ / никога не съвпада в контекста на всяка директория.

... така че ако се нуждаем от наклонена черта за .htaccess и без наклонена черта за VirtualHost, как да модифицираме шаблона? Ти го отгатна. Трябва да добавим /? да добавим следното условие в нашия регулярен израз (където нашият въпросителен знак (?) е кванторът):

  • Има между 0 и 1 / в началото на низа.

Сега нашият URL (example.com/fruit/apple) string ще съвпадне, защото се справяме с факта, че ако правилото е във файла .htaccess, то ще има 0 наклонени черти и ако идва от virtualHost ще има 1 наклонени черти.


Свързано четене:

  • Директива за пренаписване на Apache

е работил за вас: Charles Robertson | Искате ли да се свържете с нас?