Apache mod_rewrite中的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" ...

(0)

相关推荐

  • Apache mod_rewrite中的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] 假设访

  • Apache服务器中.htaccess文件的实用配置示例集锦

    .htaccess 是什么? htaccess (hypertext access,超文本访问) 是为网站所有者提供用于控制服务器环境变量以及其它参数的选项,从而增强他们网站的功能的文件.这些文件可以在网站目录树的任何一个目录中,并向该目录以及目录中的文件和子目录提供功能. 这些功能是什么呢?其实这些是服务器的指令,例如命令服务器执行特定任务的行,这些命令只对该文件所在目录中的文件和子目录有效.这些文件默认是隐藏的,因为所有操作系统和网站服务器默认配置为忽略它们,但如果查看隐藏文件的话,你就可以

  • 往xml中更新节点的实例代码

    往xml中更新节点的实例代码 /* System.out.println("2323"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = factory.newDocumentBuilder(); Document parse = docbuilder .parse(new File("src/ProdQuery.xml&q

  • java 中自定义OutputFormat的实例详解

    java 中 自定义OutputFormat的实例详解 实例代码: package com.ccse.hadoop.outputformat; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apa

  • Maven在Windows中的配置以及IDE中的项目创建实例

    Maven在Windows下的配置 1.Maven下载地址:http://maven.apache.org/download.cgi,下载红框里的版本即可. 2.解压到D盘: 3.修改配置文件settings.xml. a)修改为阿里云的镜像,国内的镜像下载速度会快很多. <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://m

  • php检测apache mod_rewrite模块是否安装的方法

    本文实例讲述了php检测apache mod_rewrite模块是否安装的方法.分享给大家供大家参考.具体实现方法如下: /** * @title Check if Apache's mod_rewrite is installed. * * @author Pierre-Henry Soria <ph7software@gmail.com> * @copyright (c) 2013, Pierre-Henry Soria. All Rights Reserved. * @return bo

  • Apache Commons Math3学习之数值积分实例代码

    Apache.Commons.Math3里面的数值积分支持类采用的是"逼近法",即,先对大区间做一次积分,再对小区间做一次积分,若两次积分结果的差值小于某一设定的误差值,则认为积分完成.否则,将区间再次细分,对细分后的区间进行积分,与前一次积分相比较,如此反复迭代,直至最近的两次积分差值足够小.这样的结果,有可能会导致无法收敛. 为了使用org.apache.commons.math3.analysis.integration包中的积分器类,需要先实现UnivariateFunctio

  • java使用分隔符连接数组中每个元素的实例

    如下所示: double[] features3 = {1,2,3};//如果是基本类型需先转为对象 <span style="font-family:Arial;font-size:14px;">commons-lang3包可用</span> Double[] features4 = ArrayUtils.toObject(features3); public String listToString(List list, char separator) { r

  • java中Base64编码原理实例讲解

    什么是 Base64 编码 Base64 编码是最常见的编码方式,基于 64 个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程. 使用场景 数据加密或签名通过 Base64 转换为字符串存储或传输. 不能传输文件的网络环境可以转换 Base64 进行网络传输. 在文本资源(如 HTML 和 CSS文件)中嵌入图片文件或其他二进制资源. 在 URL.网页中传输少量二进制数据等等. Base64 编码原理 原理是把每 3 个字节(每个字节为 8 位, 3 个字节为 24 位)重

  • requests在python中发送请求的实例讲解

    当我们想给服务器发送一些请求时,可以选择requests库来实现.相较于其它库而言,这种库的使用还是非常适合新手使用的.本篇要讲的是requests.get请求方法,这里需要先对get请求时的一些参数进行学习,在掌握了基本的用法后,可以就下面的requests.get请求实例进一步的探究. 1.get请求的部分参数 (1) url(请求的url地址,必需 ) import requests url="http://www.baidu.com" resp=requests.get(url

随机推荐