【问题标题】:What is redirect:// in PATH_TRANSLATED?PATH_TRANSLATED 中的 redirect:// 是什么?
【发布时间】:2013-01-01 19:42:03
【问题描述】:

我有一个 .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'],因为它似乎来自重定向并且没有简单地重写请求。怎么回事?

【问题讨论】:

    标签: php apache mod-rewrite


    【解决方案1】:

    我发现Apache bug report (40781) 似乎是同一个问题。引用comment by Bob Ionescu

    “问题是主请求的uri=path_info的子请求(为了获得path_translated,即path_info的物理路径视图)再次命中per-directory context中的RewriteRule并匹配;因此没有物理路径。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 有什么方法可以诊断可能是什么原因造成的?这是我在本地机器上签出并在本地主机上运行的实时代码。
      • 所以你可以在本地主机上重现它吗?您使用的是哪个 SAPI?你的 Apache 是什么,你的 PHP 版本是什么?
      • 以上发生在我的本地主机上,是的,但在实时服务器上可以正常工作。我正在运行 Apache 2.0 和 PHP 5.3.15,但不知道 SAPI 是什么。我怎么知道呢?
      • 我认为您现在应该发布更多的 .htaccess 文件。如果不是全部。你在使用一些特殊的 apache 模块吗?你可能在使用 mod_proxy 吗? -- issues.apache.org/bugzilla/show_bug.cgi?id=40781 -- stackoverflow.com/q/2262291/367456
      【解决方案3】:

      PHP documentation 表示如下:

      PHP 之前的行为是将PATH_TRANSLATED 设置为SCRIPT_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 用户可以在 httpd.conf 中使用 AcceptPathInfo = On 来定义 PATH_INFO。

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

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

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

      你可以通过enabling logs调试mod_rewrite的作用

      【讨论】:

        猜你喜欢
        • 2011-01-16
        • 2019-11-09
        • 2016-12-30
        • 1970-01-01
        • 2017-11-24
        • 2018-05-16
        • 2010-11-17
        • 2021-11-10
        相关资源
        最近更新 更多