我正在尝试使用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返回它应该的内容。
答案 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_URI
和REQUEST_FILENAME
会在触发重写时更新并重新评估。