帮助理解mod_rewrite

Pam*_*Pam 2 apache mod-rewrite configuration

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

/www/web/foo/widget.php
...
/www/app/mvc/controllers/WidgetController.php
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

M'v*_*'vy 6

没有什么是快捷方便的.

建立

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

要使用mod_rewrite,您需要加载扩展名.通常情况下,这是通过在Apache2的全局配置inmporting的rewrite.so模块(已完成/etc/apache2/apache2.conf)

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

用法

第一步

要为一个站点启用重写,您必须要求:

RewriteEngine On
Run Code Online (Sandbox Code Playgroud)

然后你就可以开始编写规则了.您需要编写规则的基本内容如下图所示:

重写国家

(另请参阅:url重写如何工作?)

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

获取资讯

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

在这里,我们需要的物品的名称:^article/(.*)$会做匹配对URL的工作article/<something>和捕捉<something>$1.(对于字符含义,我建议你查看正则表达式的教程.这里^是字符串的开头,后面是不可见的位置.com/,和URL的结尾)

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

这是通过使用a来实现的 RewriteRule

RewriteRule ^article/(.*)$ page.php?article=$1
Run Code Online (Sandbox Code Playgroud)

限制条件

要了解高级主题,您可能只想在文章名称是通过GET方法获取时应用此规则.为此,您可以包含RewriteCond类似内容

RewriteCond %{REQUEST_METHOD} GET
Run Code Online (Sandbox Code Playgroud)

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

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

最常用的是[L][R].对这些的一点解释:

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

结论

因此,您最终得到以下指令块

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

也可以看看

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