什么是path_translations中的redirect://



我有一个。htaccess规则,将/category/category-slug/请求传递到category.php。然而,当我检查$_SERVER超全局变量时,我得到了这个条目:

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

那是什么?我从来没见过redirect://

这是相关的。htaccess 规则:

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

因此,我没有得到$_GET['cat']$_GET['page']填充在我的脚本中,因为它似乎来自重定向,而不是简单地重写请求。这是怎么呢

我发现了一个Apache bug报告(40781)关于什么似乎是相同的问题。引用Bob Ionescu的评论:

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

为什么这个在Apache 2.0中没有发生?答案很简单:mod_rewrite在2.1版本之前的每个目录上下文中的子请求中不起作用。NS标志防止在子请求中处理rewriterrules。"

评论建议,你应该能够解决这个问题,包括RewriteRule s中的[NS]标志,除非你明确希望它们也适用于子请求。

$_SERVER中的PATH_TRANSLATED是一个服务器的环境变量,PHP会按照一些标准规则将其导入到$_SERVER超全局变量中。因此,环境变量的命名即使不相同,也是类似的。

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

PHP文档如下:

PHP以前的行为是将PATH_TRANSLATED设置为SCRIPT_FILENAME,并且不知道PATH_INFO是什么。(. .你应该修改你的脚本使用SCRIPT_FILENAME而不是PATH_TRANSLATED

参见$_SERVER,有一个稍微不同的注释:

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

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

所有$_SERVER变量都是从环境中读取的。对于Apache + mod_php,这个环境是由Apache服务器定义的。

老实说,我也没有看到redirect://到目前为止。您确定您的请求匹配此重写规则而不是之前的其他规则吗?

我认为mod_rewrite是你必须寻找错误的地方。

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

最新更新