2

我正在开发一个 Symfony2 PHP 应用程序。在我的 Wamp 服务器中,应用程序存储在www/mySite/其中,而我的 index.php 是www/mySite/web/app_dev.php. 因为/因此,我有类似的网址127.0.0.1/mySite/web/app_dev.php

我想更改路径,因此只需键入 127.0.0.1 即可访问我的索引文件。经过一番研究,我发现在 www 文件夹中写入这个 .htacces 是可行的:

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

唯一的问题是我不明白为什么。有人向我解释一下吗?我真的不明白最后两行,和正则表达式一样^(.*)$

谢谢

4

4 回答 4

6

这确实是一个简单的正则表达式:

^(.*)$

让我们分解一下:

  • ^- 乞求一个字符串
  • ()- 捕获组,用于匹配字符串的一部分
  • .- 任何字符
  • .*- 任意字符任意次数
  • $- 字符串的结尾

所以,把它们放在一起,它的意思是:“匹配任意数量的任意字符”。稍后这个匹配的部分(括号中的部分)被替换为/mySite/web/app_dev.php.

为了进一步解释正则表达式,我们可以想象不同的正则表达式:

  • ^lorem.*$- 以单词“lorem”开头的字符串,后跟任意数量的任意字符
  • ^$- 一个空字符串
  • ^...$- 包含三个字符的字符串。

现在,将它们放在一起 - Apache 的重写规则通常由两个指令构建:RewriteCondRewriteRule. 后一个指令将仅影响那些与RewriteCond. 您可以将它们视为“if-then”对:

# 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
于 2013-10-14T17:34:59.033 回答
3
Rewritecond %{REQUEST_URI} !^/mySite

检查并确保请求的 uri 不(“!”)以(“^”)“/mySite”开头

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

然后,如果这是真的,以("^") 任何字符(".") 任意次数("*") 开头的内容并将其发送到 "/mySite/web/app_dev.php"

因此 /controller/site-action 的 URI 将被发送到该文件,而 /mySite/css/style.css 则不会。

于 2013-10-14T17:36:24.940 回答
0

许多地方可以检查,将给出细分和解释:http ://regex101.com/

于 2013-10-14T17:37:06.693 回答
0

正则表达式一个字符一个字符地工作。在您的 `.htaccess 中,它会检查当前 URI 是否与正则表达式匹配。在此图像中,在字符后跟随行字符,它返回 true:

正则表达式可视化

^$代表字符串的开头和结尾。 .允许任何字符并*告诉“尽可能多地重复最后一条规则”。

于 2013-10-14T18:10:43.723 回答