Php 理解一个简单的正则表达式
我正在开发一个Symfony2 PHP应用程序。在我的Wamp服务器中,应用程序存储在Php 理解一个简单的正则表达式,php,regex,.htaccess,symfony,Php,Regex,.htaccess,Symfony,我正在开发一个Symfony2 PHP应用程序。在我的Wamp服务器中,应用程序存储在www/mySite/中,my index.php是www/mySite/web/app_dev.php。正因为如此,我有了类似127.0.0.1/mySite/web/app_dev.php的URL 我想更改路径,因此只需键入127.0.0.1即可访问索引文件。经过一些研究,我发现在www文件夹中写下这个.htacces是有效的: RewriteEngine on Rewritecond %{REQUEST_
www/mySite/
中,my index.php是www/mySite/web/app_dev.php
。正因为如此,我有了类似127.0.0.1/mySite/web/app_dev.php的URL
我想更改路径,因此只需键入127.0.0.1即可访问索引文件。经过一些研究,我发现在www文件夹中写下这个.htacces是有效的:
RewriteEngine on
Rewritecond %{REQUEST_URI} !^/mySite
Rewriterule ^(.*)$ /mySite/web/app_dev.php
唯一的问题是我不明白为什么。有人给我解释一下吗?
我不太理解最后两行,正则表达式类似于^(.*)$
谢谢这确实是一个简单的正则表达式:
^(.*)$
让我们把它分开:
-请求字符串^
和(
-捕获组,用于匹配字符串的一部分)
-任何字符
-任意字符任意次数*
-字符串的结尾$
/mySite/web/app_dev.php
为了进一步解释正则表达式,我们可以想象不同的正则表达式:
-字符串,以单词“lorem”开头,后跟任意数量的任意字符^lorem.*$
-空字符串^$
-包含三个字符的字符串^…$
现在,把它们放在一起——Apache的重写规则通常由两个指令构成:
RewriteCond
和RewriteRule
。后一个指令将只影响那些与RewriteCond
中给出的条件相匹配的请求。您可以将它们视为“如果-然后”对:
检查并确保请求的uri不以(“^”)/mySite开头(“!”)
然后,如果这是真的,将以(“^”)任何字符(“.”)开头的内容多次(“*”)发送到“/mySite/web/app_dev.php”
因此,/controller/site action的URI将被发送到该文件,而/mySite/css/style.css将不会被发送到该文件。需要检查的许多地方将给出详细信息和解释:正则表达式一个字符接一个字符地工作。在“.htaccess”中,它检查当前URI是否与正则表达式匹配。在该图像中,在字符后跟随行字符,并返回true:
^
和$
代表字符串的开头和结尾。
允许任何字符,*
告诉“尽可能多地重复上一条规则”。意味着任意次数的字符,转到/mySite/web/app_dev.php
好,但我不明白为什么如果我删除Rewritecond,那么它就不起作用?@user2108742-从mod_rewrite:“如果希望与每个目录(htaccess)重写规则中的完整URL路径匹配,请在重写条件中使用%{REQUEST_URI}变量。”。“好的,现在如果我转到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——它不应该这样做。尝试在规则末尾添加[R=301,L]
,即:Rewriterule^(.*)$/mySite/web/app_dev.php[R=301,L]
R=301将我重定向到完整的实际路径。这很好,但我希望保持url像juste127.0.0.1/home.php一样干净。我该怎么做?
# 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
Rewritecond %{REQUEST_URI} !^/mySite
Rewriterule ^(.*)$ /mySite/web/app_dev.php