我有一个。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的功能