【问题标题】:Apache mod_rewrite explanationApache mod_rewrite 解释
【发布时间】:2014-01-14 10:49:23
【问题描述】:

谁能解释一下这个 mod_rewrite 正则表达式是如何工作的?

<IfModule rewrite_module>
  RewriteEngine On
  RewriteRule ^(.*)$ /Symfony/web/app_dev.php [QSA,L]
</IfModule>

当我输入http://localhost/hello/testingonly时,它会被重定向到什么地方?

编辑:

我目前正在尝试使用 Symfony 框架并尝试在线教程。 http://localhost/Symfony/web/app_dev.php/hello/testingonly 实际上显示了一个页面,上面写着“Hello $name”,在这种情况下,$name 指的是“testingonly”。

因此,如果您访问此页面http://localhost/Symfony/web/app_dev.php/hello/matthew,该页面将显示“Hi mathew”。

接下来我想做的是从 URL 中删除 Symfony/web/app_dev.php,然后我复制并粘贴了上面的重写规则,它运行良好。

我想知道的是它如何解释哪个是名称参数。

如果我访问http://localhost/hello/mathew,根据重写规则,它应该只是http://localhost/Symfony/web/app_dev.php,并且参数应该会丢失。但它怎么会显示“Hello mathew”?

【问题讨论】:

  • 您能否具体说明一下您不了解的内容? mod_rewrite 相当复杂,允许为不同目的定义各种重写规则和条件。上面的示例使用正则表达式将使用的 apache 上下文 (dir/host...) 中的所有请求重写为 app_dev.php。见mod_rewrite docs
  • @Matthias,抱歉没有具体说明。我将编辑我的问题

标签: regex apache symfony mod-rewrite


【解决方案1】:

此规则将所有内容重定向到/Symfony/web/app_dev.php

                ^(.*)$ match everything (start, any char 0~n times, end)
               /
RewriteRule ^(.*)$ /Symfony/web/app_dev.php [QSA,L]
                                              /  /
           [QSA] keep GET parameters in the URL / 
                                               /
   [L] mean "if match, does not read next rules"

由于您没有[R=301] 标志,因此此重定向是透明的。

所以:

  • http://localhost/hello/testingonly 重定向到: http://localhost/Symfony/web/app_dev.php,但 URL 保持不变。
  • http://localhost/hello/testingonly?foo=bar 重定向到: http://localhost/Symfony/web/app_dev.php?foo=bar,但 URL 保持不变。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2017-04-01
相关资源
最近更新 更多