小知识: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” …
声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Apache2.4.x版wampserver本地php服务器如何让外网访问及启用.htaccess

2023-3-17 10:47:55

建站知识

小知识:Apache中配置支持CORS(跨域资源共享)实例

2023-3-17 11:02:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索