假设我在网络服务器上设置了以下文件系统:
/www/web/foo/widget.php
...
/www/app/mvc/controllers/WidgetController.php
我需要弄清楚如何使用mod_rewrite将widget.php的页面请求(及其各自的GET / POST数据)映射到其控制器WidgetController.php。
看起来mod_rewrite是超级强大的,因而很复杂。是否有一种快速简便的方法让某人向我解释如何实现这一目标?我需要更改哪些文件?有人能告诉我这个“小部件”示例的示例规则吗?
谢谢!
答案 0 :(得分:6)
没有什么是快捷的。
首先,您必须确保已安装软件包
要使用mod_rewrite,您需要加载扩展名。通常,这是通过在apache2全局配置中导入rewrite.so模块来完成的(/etc/apache2/apache2.conf
)
通常所有mod_rewrite指令都写在虚拟主机定义中。 (说:/etc/apache2/site-available/000default
)
要为一个站点启用重写,您必须通过以下方式提出要求:
RewriteEngine On
然后你就可以开始写规则了。您需要编写规则的基本内容由下图描述:
(另见: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
您可以在此处找到其他资源: