3

我有一个.htaccess规则,它将对/category/category-slug/的请求传递给category.php。但是,当我检查$_SERVER超全局时,我得到了这个条目:

Array
(
    [PATH_TRANSLATED] => redirect://
)

那是什么?我以前从未见过重定向://

这是相关的.htaccess规则:

RewriteRule ^category/([^/]+)/?(.*) /category.php?cat=$1&page=$2 [L,QSA]

结果,我没有在我的脚本中获取$_GET['cat']$_GET['page']填充,因为它似乎来自重定向并且没有简单地重写请求。这是怎么回事?

4

3 回答 3

2

我发现了一份关于似乎是同一问题的Apache 错误报告 (40781) 。引用Bob Ionescu 的评论

“问题是主请求的 uri=path_info 的子请求(为了获得 path_translated,即 path_info 的物理路径视图)再次命中每个目录上下文中的 RewriteRule 并匹配;因此没有物理路径。

为什么在 Apache 2.0 中不会出现这种情况?答案很简单:mod_rewrite 不会在 2.1 之前的每个目录上下文中的子请求中起作用。NS 标志阻止处理子请求中的 RewriteRules。”

该评论建议您应该能够通过在您的 s 中包含[NS]标志RewriteRule来解决此问题,除非您明确希望它们也适用于子请求。

于 2013-01-01T20:23:50.730 回答
1

PATH_TRANSLATEDin是服务器的环境变量,PHP按照一些标准规则$_SERVER将其导入到超全局中。$_SERVER因此,环境变量的名称相似(如果名称不同)。

仅通过环境变量的名称不能说究竟是什么设置了这个值,但是你的问题的上下文表明它是由 Aapache HTTPD 网络服务器设置的。

于 2013-01-01T19:46:47.537 回答
1

PHP 文档说明如下:

PHP 以前的行为是设置PATH_TRANSLATEDSCRIPT_FILENAME,并且不了解 PATH_INFO 是什么。[..] 您应该修复您的脚本以使用SCRIPT_FILENAME而不是PATH_TRANSLATED.

另请参阅$_SERVER略有不同的注释:

在服务器完成任何虚拟到真实的映射之后,当前脚本的基于文​​件系统(不是文档根目录)的路径。

注意:从 PHP 4.3.2 开始,PATH_TRANSLATED 在 Apache 2 SAPI 下不再隐式设置,这与 Apache 1 中的情况不同,在 Apache 1 中,当它没有被 Apache 填充时,它被设置为与 SCRIPT_FILENAME 服务器变量相同的值。进行此更改是为了符合 CGI 规范,即 PATH_TRANSLATED 只有在定义了 PATH_INFO 时才应该存在。Apache 2 用户可以在httpd.conf中使用AcceptPathInfo = On来定义 PATH_INFO。

所有$_SERVER变量都是从环境中读取的。在 Apache + mod_php 的情况下,此环境由 Apache 服务器定义。

老实说redirect://,到目前为止我也没有看到。您确定您的请求符合此重写规则,而不是之前的另一个吗?

我认为 mod_rewrite 是您必须查找错误的地方。

您可以通过启用日志来调试 mod_rewrite 的功能

于 2013-01-01T20:11:48.303 回答