【问题标题】:Understanding a simple regex理解一个简单的正则表达式
【发布时间】:2013-10-22 08:20:29
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 表示any number of charachters for any number of times, goes to /mySite/web/app_dev.php

标签: php regex .htaccess symfony


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    ^(.*)$
    

    让我们分开吧:

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

    所以,把它们放在一起,它的意思是:“匹配任意数量的任意字符”。稍后此匹配部分(括号中的部分)将替换为/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
    

    【讨论】:

    • 好的,但我不明白为什么如果我删除了 Rewritecond 那么它就不起作用了?
    • @user2108742 - 来自 mod_rewrite doc:“如果您希望匹配每个目录 (htaccess) RewriteRule 中的完整 URL 路径,请在 RewriteCond 中使用 %{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 像 juste 127.0.0.1/home.php 一样干净。我该怎么做?
    【解决方案3】:

    有很多地方可以查看,会给出细分和解释:http://regex101.com/

    【讨论】:

      【解决方案4】:
      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 则不会。

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 1970-01-01
        • 2016-10-11
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        相关资源
        最近更新 更多