mod-rewrite THE_REQUEST和(REQUEST_URI或REQUEST_FILE)给出不同的文件名 - 为什么?

C.O*_*.O. 7 apache .htaccess mod-rewrite

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

手册说:

THE_REQUEST

浏览器向服务器发送的完整HTTP请求行(例如,"GET /index.html HTTP/1.1").这不包括浏览器发送的任何其他标头.与以下大多数其他变量不同,此值尚未转义(解码).

REQUEST_URI

HTTP请求行中请求的资源.(在上面的例子中,这将是"/index.html".)

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

<?php
echo $_GET['requestedURI'];
?>
Run Code Online (Sandbox Code Playgroud)

在.htaccess文件我有:

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

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ bootstrap.php?requestedURI=%{REQUEST_URI} [L]
Run Code Online (Sandbox Code Playgroud)

请求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返回它应该的内容.

Gum*_*mbo 3

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

\n\n
RewriteCond %{REQUEST_FILENAME} !-d\nRewriteRule .+ bootstrap.php\n
Run Code Online (Sandbox Code Playgroud)\n