2013-01-01 19 views
3

我有通行证/分类/类别的蛞蝓/category.php请求的.htaccess规则。然而,当我检查$_SERVER超级全局,我得到这个条目:什么是重定向://在PATH_TRANSLATED中?

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

那是什么?我从来没有见过重定向://之前。

这是初步认识的.htaccess规则:

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

其结果是,我没有得到我$_GET['cat']$_GET['page']填充在我的剧本,因为它似乎是从一个重定向,而不是来自具有要求被简单地重写。这是怎么回事?

回答

1

PATH_TRANSLATED in $_SERVER是一个服务器的环境变量,由PHP根据一些标准规则导入到超全局的$_SERVER中。因此,如果环境变量的名称不相同,它也是类似的。

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

+0

有没有什么办法可以诊断*会导致这种情况?它是我在本地机器上签出并在本地主机上运行的实时代码。 –

+0

那么你可以在localhost上重现吗?你在使用哪个SAPI?什么是你的Apache,你的PHP版本是什么? – hakre

+0

以上发生在我的本地主机上,是的,但它的工作原理应该在现场服务器上。我正在运行Apache 2.0和PHP 5.3.15,但不知道SAPI是什么。我将如何发现? –

1

PHP documentation说以下内容:

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

也看到$_SERVER有一个稍微不同的音符:

系统(不是文档根目录)的路径添加到当前脚本,服务器进行虚拟到真实映射后。

注:自PHP 4.3.2起,PATH_TRANSLATED不再含蓄对比设定在Apache 2 SAPI的情况和Apache 1,在那里它被设置为相同的值作为SCRIPT_FILENAME服务器变量时,它不是由Apache填充。此更改符合CGI规范,PATH_TRANSLATED应该仅在定义PATH_INFO时存在。 Apache 2用户可以使用AcceptPathInfo =在里面httpd.conf来定义PATH_INFO。

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

说实话,我要么到目前为止没有看到redirect://。 你确定,你的请求符合这个重写规则而不是另一个吗?

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

可以调试哪些mod_rewrite的确实由enabling logs

2

我发现了一个Apache bug report (40781)什么似乎是同样的问题。引述comment by Bob Ionescu

“的问题是,与URI =主请求的PATH_INFO的子请求(为了获得PATH_TRANSLATED,即PATH_INFO的物理路径视图)击中重写规则中每个目录的上下文中再并且匹配;因此没有物理路径

为什么在Apache 2.0中不会发生这种情况?答案很简单:mod_rewrite不会在每个目录上下文中的子请求中使用2.1之前的版本NS标志阻止了RewriteRules在子请求中“。

的意见建议,你应该能够通过在您RewriteRule S中[NS] flag,来解决这个问题,除非你明确他们应用到子请求了。