Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 理解一个简单的正则表达式_Php_Regex_.htaccess_Symfony - Fatal编程技术网

Php 理解一个简单的正则表达式

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_

我正在开发一个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_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