mod_rewrite THE_REQUEST和(REQUEST_URI或REQUEST_FILENAME)给出不同的文件名 - 为什么?

时间:2011-05-15 16:02:10

标签: apache .htaccess mod-rewrite

我正在尝试使用mod-rewrite。我认为我想要的很简单但我没有通过REQUEST_URI获得所请求文件的URI。而是传递提供的名称。

manual说:

  

THE_REQUEST

     

完整的HTTP请求   浏览器发送到服务器的行   (例如,“GET /index.html HTTP / 1.1”)。   这不包括任何额外的   浏览器发送的标头。这个   价值尚未转义   (解码),与大多数其他变量不同   下方。

     

REQUEST_URI

     

请求的资源   在HTTP请求行中。 (在里面   上面的例子,这将是   “/index.htm” 明明。)

然而,两个在我的测试中给出了不同的文件名。我有一个bootstrap.php,我想通过它发送所有请求。这是测试文件:

<?php
echo $_GET['requestedURI'];
?>
我在.htaccess文件上的

### REWRITE RULES ###
RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ bootstrap.php?requestedURI=%{REQUEST_URI} [L]

请求http://localhost/test.htm发出: /bootstrap.php

如果我在.htaccess中放入THE_REQUEST而不是REQUEST_URI,我会得到 GET /test.htm HTTP / 1.1

那么为什么不满足于THE_REQUEST?好吧,只要查询字符串存在就会中断。如果我要求:http://localhost/test.htm?x=1&y=2我得到 GET /test.htm?x=1 第一个&符打破了事情。我认为应该可以用%26替换查询字符串中的所有&符号,以便它可以工作,但到目前为止我没有管理...

那么有人能说出为什么REQUEST_URI失败以及如何修复它或如何在查询字符串中将&符号重写为%26?

感谢。

编辑:上面的报告适用于Win 7上的xampp 1.7.3。我同时在生产Linux系统上尝试过它,然后REQUEST_URI返回它应该的内容。

2 个答案:

答案 0 :(得分:3)

您无需显式传递请求的URI路径和查询,因为您可以通过$_SERVER['REQUEST_URI']在PHP中访问它。因此,这应该足够了:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ bootstrap.php

答案 1 :(得分:2)

我已经环顾了一下,并没有找到任何好的解释,为什么%{REQUEST_URI}的行为与你的例子中的行为相同。实现你的目标最常见的方式似乎是反向引用:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ bootstrap.php?requestedURI=$1 [L]

修改

根据您的评论,似乎REQUEST_URIREQUEST_FILENAME会在触发重写时更新并重新评估。