通常,客户永远不应该看到 SECRET_TOKEN - 正如你所说,重写是服务器内部的。
SECRET_TOKEN
但是,这是可能的 SECRET_TOKEN 可能会在某些条件下暴露,具体取决于服务器配置。
例如,使用您发布的代码, SECRET_TOKEN 可以通过请求暴露出来 example.com/public 要么 example.com/subdir (哪里 subdir 是一个子目录 /public ) - 注意遗漏斜杠。
example.com/public
example.com/subdir
subdir
/public
的 example.com/public 强> - 如果你要求 /public (没有尾部斜杠)然后mod_dir通过附加一个尾部斜杠“纠正”这个,这是通过301外部重定向实现的。但是,重定向不会立即发生并且您的 RewriteRule 指令最终重写此请求(因为 REQUEST_URI 变量仍然存在 /public 在这一点上 - 没有尾随斜线) /public/?token=SECRET_TOKEN (注意目录上的尾部斜杠)。 (URL路径似乎没有被更新 RewriteRule 出于某种原因,正如您可能预期的那样 /public/public 但是,仍会附加查询字符串。也许与mod_dir发出的子请求有关?不确定为什么?)因为已经由mod_dir触发了301,这个响应(包含 SECRET_TOKEN )现在作为一个发送回用户 外部重定向 和 SECRET_TOKEN 暴露了。
RewriteRule
REQUEST_URI
/public/?token=SECRET_TOKEN
/public/public
的 example.com/subdir 强> - 如果有一个子目录,会发生类似(但略有不同)的事情 /public/subdir 你要求了 /subdir (没有尾随斜线)。您的 RewriteRule 这次指令首先在内部重写并在内部重写请求 /public/subdir?token=SECRET_TOKEN 。好到目前为止。但是然后mod_dir开始并希望附加一个尾随斜杠 /public/subdir - 它使用外部301重定向执行此操作。所以请求现在 重定向 至 /public/subdir/?token=SECRET_TOKEN 和 SECRET_TOKEN 暴露给用户(以及 /public 子目录,以前是未知的)。
/public/subdir
/subdir
/public/subdir?token=SECRET_TOKEN
/public/subdir/?token=SECRET_TOKEN
但是,以这种方式使用查询字符串确实有一些其他警告:
就目前而言,您将覆盖请求中的任何其他查询字符串。
要合并请求中的现有查询字符串,您需要指定 QSA 国旗上 RewriteRule 。但是,如果用户随后附加 ?token= 根据请求,他们会覆盖你的 token URL参数如果你想用这个来读它 $_GET PHP脚本中的超全局。您可以通过显式包含来手动更改查询字符串参数的顺序 QUERY_STRING 服务器变量 代换 而不是使用QSA标志 - 但这有点混乱(例如,如果没有查询字符串怎么办?)。
QSA
?token=
token
$_GET
QUERY_STRING