Apache mod_rewrite中的REQUEST_URI使用实例

 更新时间:2015年01月27日 10:03:52   投稿:junjie  
这篇文章主要介绍了Apache mod_rewrite中的REQUEST_URI使用实例,本文使用一个实例讲解如何使用REQUEST_URI,需要的朋友可以参考下

如下规则:

复制代码 代码如下:

RewriteEngine on
# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1
# redirected all invalid request the the index bootstrap
RewriteRule !\.(htm|txt|xml|css|js|swf|gif|jpg|png|ico)$ index.php [L]

假设访问 sitemap_index.xml ,当经过两次RewriteRule之后,传给bootstrap程序 index.php 的 $_SERVER['REQUEST_URI'] 值仍然是 /sitemap_index.xml ,但实际上希望是 /sitemap/index ,这样 index.php 才能正确的进行 url route 。

要达到这个目的,有两个方法。

第一种方式,配合 mod_proxy ,将第一条重写规则改为

复制代码 代码如下:

# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1 [P,L]

这样将在内部产生一个新的URL请求, REQUEST_URI 的值也就变成了新的 /sitemap/index 。但这种方法制造了额外的一次 http 请求。

第二种方法,将第一条规则改为

复制代码 代码如下:

# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1 [E=REQUEST_URI:/sitemap/$1]

或者
复制代码 代码如下:

# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ index.php [E=REQUEST_URI:/sitemap/$1,L]

然后通过 $_SERVER['REDIRECT_REQUEST_URI'] 变量得到 值 /sitemap/index (注意使用 E 设置环境变量的时候,mod_rewrite 自动给变量加上 REDIRECT_ 前缀)。

有趣的是在 Rewrite 的过程中 REQUEST_URI 的值始终保持是原始的请求URI,但在 mod_setenvif 中提供的 SetEnvIf / SetEnvIfNoCase 中所使用的 Request_URI 属性得到的却是经过 rewrite 之后的地址而非原始 GET/POST 中的 URI。

所以如果在 httpd.conf / httpd-vhosts.conf 中想使用

复制代码 代码如下:

SetEnvIfNoCase Request_URI "sitemap" ...

来针对 sitemap 设置环境变量的话是不起作用的,因为这时候传给 SetEnvIfNoCase 进行判断的 Request_URI 是 index.php 而不是 sitemap_index.xml 或 sitemap/index 。想要得到原始的 Request_URI 信息就必须在 rewrite 规则的最开始进行保存,比如在 rewrite 规则开头加入
复制代码 代码如下:

SetEnvIfNoCase Request_URI "(^/sitemap_.*\.xml)" MY_REQUEST_URI_BF_REWRITE=$1

然后在需要的地方使用
复制代码 代码如下:

SetEnvIfNoCase MY_REQUEST_URI_BF_REWRITE "sitemap" ...

相关文章

  • 详解ssh免密码登录配置方法(图示加命令)

    详解ssh免密码登录配置方法(图示加命令)

    这篇文章主要介绍了详解ssh免密码登录配置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 轻松搞定VIM高亮NGINX配置文件的方法

    轻松搞定VIM高亮NGINX配置文件的方法

    在使用vim在写东西的时候,如果有语法高亮显示就会方便很多,之前给大家介绍了很多关于vim高亮的文章,那这篇文章主要给大家介绍了如何轻松搞定VIM高亮NGINX配置文件的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • 在Linux中将用户添加到特定组的四种方法

    在Linux中将用户添加到特定组的四种方法

    本文详细介绍了在Linux系统中将用户添加到特定组的四种方法:使用`usermod`命令、`gpasswd`命令、Shell脚本以及手动编辑`/etc/group`文件,通过这些方法,可以方便地管理用户的主要组和次要组,实现用户权限的灵活配置,需要的朋友可以参考下
    2025-02-02
  • 简单测试Apache是如何完成负载均衡策略配置

    简单测试Apache是如何完成负载均衡策略配置

    公司的系统在最初设计的时候就已经考虑到了负载均衡的规划,此次 就是对负载均衡的一个简单测试
    2014-01-01
  • CentOS8中的nmcli使用详解

    CentOS8中的nmcli使用详解

    这篇文章主要介绍了CentOS8的nmcli使用,基于RHEL8/CentOS8的nmcli常见命令使用,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Linux下如何检查网卡bonding状态和切换主备网卡

    Linux下如何检查网卡bonding状态和切换主备网卡

    这篇文章主要介绍了Linux下如何检查网卡bonding状态和切换主备网卡问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 解决Linux中nohup.out日志过大问题

    解决Linux中nohup.out日志过大问题

    这篇文章主要介绍了解决Linux中nohup.out日志过大问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • centos7.2搭建nginx的web服务器部署uniapp项目

    centos7.2搭建nginx的web服务器部署uniapp项目

    这篇文章主要介绍了centos7.2搭建nginx的web服务器部署uniapp项目,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 谈一谈Linux系统重要的子目录问题

    谈一谈Linux系统重要的子目录问题

    这篇文章主要介绍了Linux系统重要的子目录问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-09-09
  • 详解虚拟机中CentOS 7 网络和ssh的配置

    详解虚拟机中CentOS 7 网络和ssh的配置

    这篇文章主要介绍了详解虚拟机中CentOS 7 网络和ssh的配置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03

最新评论