帮助理解mod_rewrite

时间:2011-06-22 20:21:28

标签: apache mod-rewrite configuration

假设我在网络服务器上设置了以下文件系统:

/www/web/foo/widget.php
...
/www/app/mvc/controllers/WidgetController.php

我需要弄清楚如何使用mod_rewrite将widget.php的页面请求(及其各自的GET / POST数据)映射到其控制器WidgetController.php。

看起来mod_rewrite是超级强大的,因而很复杂。是否有一种快速简便的方法让某人向我解释如何实现这一目标?我需要更改哪些文件?有人能告诉我这个“小部件”示例的示例规则吗?

谢谢!

1 个答案:

答案 0 :(得分:6)

没有什么是快捷的。

设置

首先,您必须确保已安装软件包

要使用mod_rewrite,您需要加载扩展名。通常,这是通过在apache2全局配置中导入rewrite.so模块来完成的(/etc/apache2/apache2.conf

通常所有mod_rewrite指令都写在虚拟主机定义中。 (说:/etc/apache2/site-available/000default

用法

第一步

要为一个站点启用重写,您必须通过以下方式提出要求:

RewriteEngine On

然后你就可以开始写规则了。您需要编写规则的基本内容由下图描述:

Rewrite States

(另见:How does url rewrite works?

为了帮助我理解它的工作原理,请始终从服务器端(而非客户端)进行考虑。 您从客户端收到一个URL。此URL具有您定义的特定格式。 (例如http://blog.com/article/myarticle-about-a-certain-topic)。但阿帕奇自己也无法理解这一点,所以我们需要帮助他。我们知道控制器是page.php,可以按名称查找文章。

获取信息

现在我们伪造一个regex来从URL中提取信息。所有正则表达式都与您的域名后面的内容相匹配(此处:article/myarticle-about-a-certain-topic没有第一个/ - 可以在最近的重写版本中编写)

我们需要文章的名称:^article/(.*)$将执行将网址与article/<something>匹配并将<something>捕获到$1的工作。 (对于字符含义,我建议你查看正则表达式的教程。这里^是字符串的开头,.com/之后的不可见位置,以及URL的结尾)

所以现在我们需要告诉apache这个URL意味着http://myblog.com/page.php?article=myarticle-about-a-certain-topic

这是通过使用RewriteRule

实现的
RewriteRule ^article/(.*)$ page.php?article=$1

限制条件

要了解高级主题,您可能只想在文章名称是通过GET方法获取时才应用此规则。为此,您可以添加RewriteCond之类的

RewriteCond %{REQUEST_METHOD} GET

它在文件中的RewriteRule之前,但在它之后进行测试。

标志

如果要进行大量重定向/重写,则必须了解flags

最常用的是[L][R]。关于这些的一点解释:

  • [R]要求重定向,可以调整为[R=302],其中302是HTTP协议的重定向状态号。这将强制客户端使用重写的URL发出新请求。因此,他将在地址栏中看到重写的URL。
  • [L]迫使apache停止处理规则。请注意,它确实意味着当前的传入URL将不再被修改,但重写的URL WILL 将再次进行重写。如果你想避免循环,请记住这一点。

结论

所以你最终得到以下指令块

RewriteEngine On
RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^article/(.*)$ page.php?article=$1

另见

您可以在此处找到其他资源: