【问题标题】:PHP: How can I get the URL that has been rewritten with mod_rewrite?PHP:如何获取已用 mod_rewrite 重写的 URL?
【发布时间】:2011-09-29 03:22:59
【问题描述】:

例如,如果我将/category/topic/post/ 重写为/index.php?cat=1&topic=2&post=3,如何使用PHP 获得/index.php?cat=1&topic=2&post=3

【问题讨论】:

  • 简短回答:你不能。但是,如果您的应用程序知道重写方案(即您有反向映射)或者您有明确定义的重写规则,您可以反向重写过程。
  • 如果使用 URL 重写模块 v2,@Emre $_SERVER['REQUEST_URI'] 将在 Apache 服务器和 IIS 7.x 上正常工作。
  • 为什么要这个网址?可能有更简单的解决方案来完成您想要完成的任务。
  • @LazyOne 你说得对,我忘记了。
  • 用于 mod_rewrite 提取和调试书签此链接:askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html

标签: php mod-rewrite


【解决方案1】:

您可以在 mod_rewrite 规则中设置环境变量,然后在 PHP 中使用它。 示例:

mod_rewrite:

RewriteEngine on
RewriteRule ^/(category)/(topic)/(post)/$ /index.php?cat=$1&topic=$2&post=$3 [L,QSA,E=INDEX_URI:/index.php?cat=$1&topic=$2&post=$3]

PHP:

$index_uri = $_SERVER['INDEX_URI'];

【讨论】:

    【解决方案2】:

    下面是在Apache中用mod_rewrite重写后如何获取PHP接收到的URL:

     $url = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
    

    您可以将此url与浏览器中的实际url进行比较,以调试.htaccess中的任何重写规则

    【讨论】:

      【解决方案3】:

      您可以很容易地重新创建它。 $_SERVER['PHP_SELF'] 仍会为您提供正确的脚本文件名。这应该可以解决问题:

      $url = $_SERVER['PHP_SELF'];
      $parts = array();
      foreach( $_GET as $k=>$v ) {
          $parts[] = "$k=" . urlencode($v);
      }
      
      $url .= "?" . implode("&", $parts);
      

      $url 现在将成为您要查找的 URL。

      编辑:@carpereret 的回答要好得多。给他点个赞

      【讨论】:

      • $_SERVER['QUERY_STING']; 包含与发送时完全相同的查询字符串。无需重新组合它。这可以更简单地表示为。 $url = implode('?', array_filter([$_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']]));
      • -1,因为 carpereret 的答案给出了其他内容,而您的答案是正确的。我不知道您为什么编辑您的帖子并使其无效。你应该删除它。
      【解决方案4】:

      原始 uri 应该在 $_SERVER['REQUEST_URI']

      【讨论】:

      • 好一个。此外,这将为您提供浏览器地址栏上显示的完整网址,以防您重写它。
      • 这与 OP 的要求相反。 OP 询问如何获取重写后的 URL,而不是其原始形式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      相关资源
      最近更新 更多