2013-10-14 3 views
2

Я разрабатываю приложение PHP Symfony2. На моем сервере Wamp приложение хранится в www/mySite/, а мой index.php - www/mySite/web/app_dev.php. Потому что/из этого, у меня есть URL-адрес, как 127.0.0.1/mySite/web/app_dev.phpПонимание простого регулярного выражения

Я хотел изменить путь, поэтому я получаю свой индексный файл, просто набрав 127.0.0.1. После некоторых исследований, я понял, что это сочинительство .htacces в работах папки WWW:

RewriteEngine on 
Rewritecond %{REQUEST_URI} !^/mySite 
Rewriterule ^(.*)$ /mySite/web/app_dev.php 

Единственная проблема заключается в том, что я не понимаю, почему. Кто-нибудь объясняет это мне? я не очень понимаю, две последние строки, и регулярное выражение, как ^(.*)$

Благодарности

+0

означает 'любое количество символов для любого количества раз, переходит в/mySite/web/app_dev.php' –

ответ

6

Это простое регулярное выражение действительно:

^(.*)$ 

Давайте разбить его:

  • ^ - попрошайка нити
  • ( и ) - захват группы, используется для согласования части строки
  • . - любой символ
  • .* - любое charactery любое количество раз
  • $ - конец строки

Таким образом, поставив его все вместе, это означает: «соответствовать любому количеству символов». Позже эта согласованная часть (часть в скобках) заменяется на /mySite/web/app_dev.php.

Чтобы объяснить регулярные выражения немного больше мы могли себе представить различные регулярные выражения:

  • ^lorem.*$ - строка, начинающаяся со словом «Lorem», а затем любое число любых символов
  • ^$ - пустая строка
  • ^...$ - строка, содержащая три символа.

Теперь, положив все это вместе - правила перезаписи Апача, как правило, построены из двух директив: RewriteCond и RewriteRule. Последняя директива будет влиять только на те запросы, которые соответствуют условию, указанному в RewriteCond. Вы можете думать о них как "если-то" пары:

# the "if" part - if request URI does not match ^/mySite 
Rewritecond %{REQUEST_URI} !^/mySite 

# the "then" part - then rewrite it to "/mySite/web/app_dev.php" 
Rewriterule ^(.*)$ /mySite/web/app_dev.php 
+0

Хорошо, но я не понимаю, почему, если я удалю Rewritecond, тогда это не сработает? – user2108742

+0

@ user2108742 - из mod_rewrite [doc] (http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule): «Если вы хотите сопоставить полный URL-путь в per- directory (htaccess) RewriteRule, используйте переменную% {REQUEST_URI} в RewriteCond. " – kamituel

+0

Итак, теперь, если я перейду к 127.0.0.1, он перенаправляет меня на 127.0.0.1/mySite/web/app_dev.php. Хорошо. Но если я наберу 127.0.0.1/homePage.php, он перенаправит меня на 127.0.0.1/mySite/web/app_dev.php/homePage.php. Это тоже хорошо, но я не понимаю, почему. Я думал, что он перенаправит все^(. *) $ В app_dev.php. Итак, как это можно перенаправить на app_dev.php/homePage.php? – user2108742

3
Rewritecond %{REQUEST_URI} !^/mySite 

Проверьте и убедитесь, что запрошенный URI не ("!") Начинаются с ("^") "/ MySITE"

Rewriterule ^(.*)$ /mySite/web/app_dev.php 

Тогда, если это правда, принимать вещи, начиная с ("^") любой символ (" ") любое количество раз (" *") и отправить его в «/ MySITE/веб/app_dev.PHP»

Так УИР/контроллера/сайта-действия будут отправлены в этот файл, а /mySite/css/style.css не будет.

0

Регулярные выражения работают характер после того, как символ в своем `.htaccess он проверяет, является ли текущий URI совпадает с регулярным выражением В этом изображении, следовать символ перевода строки после символа и возвращает истину:..

Regular expression visualization

^ и $ стенд для начала и конца строки. . позволяет любому символу и * сообщать «как можно чаще повторять последнее правило».

Смежные вопросы