【问题标题】:PHP File request from url directory来自 url 目录的 PHP 文件请求
【发布时间】:2013-10-05 15:42:39
【问题描述】:

这可能是一个非常简单的问题。无论如何,您如何在没有请求的情况下使用来自 url 的变量。例如:

www.mysite.com/get.php/id/123

然后页面从数据库中检索 id 123。

这是怎么做到的?提前致谢!

更新

如果我有以下结构:

support/
        sys/
            issue/
                  issue.php
            .htaccess
            home.php
            etc.....

.htaccess 文件包含:

RewriteEngine On 
RewriteRule ^/issue/(.*)$ /issue/issue.php?id=$1 [L]

为什么我必须输入:

http://www.mysite.com/support/sys/issue/issue/1234

为了加载文件?当我想输入时

http://www.mysite.com/support/sys/issue/1234

另外,文件加载后如何检索 id?

【问题讨论】:

    标签: php .htaccess directory


    【解决方案1】:

    只是想知道为什么没有答案提到你使用RewriteBase

    根据 Apache 手册:

    RewriteBase 指令指定要用于的 URL 前缀 每个目录 (htaccess) 的 RewriteRule 指令替换 相对路径。

    在您的/support/sys/issue/.htaccess 中使用RewriteBase,代码将很简单:

    RewriteEngine On
    RewriteBase /support/sys/issue/
    
    RewriteRule ^([0-9+)/?$ issue.php?id=$1 [L,QSA]
    

    然后在你的issue.php 中你可以这样做:

    $id = $_GET['id'];
    

    从 URL 中检索您的 ID。

    【讨论】:

      【解决方案2】:

      问题

      这是一个非常基本/常见的问题,源于您的 .htaccess 规则正在重写一个包含实际存在的目录的 url...

      文件结构

      >support
          >sys
              >issue
                  issue.php
              .htaccess
      

      (即issue目录和.htaccess文件在同一目录:sys

      重写问题

      然后:

      RewriteEngine ON
      RewriteRule ^issue/(.*)/*$ issue/issue.php?id=$1 [L]
      # Note the added /* before $. In case people try to access your url with a trailing slash
      

      不会工作。这是因为(注意:-> = 重定向到):
      http://www.mysite.com/support/sys/issue/1234
      -> http://www.mysite.com/support/sys/issue/issue.php?id=1234
      -> http://www.mysite.com/support/sys/issue/issue.php?id=issue.php

      示例/测试

      试试var_dump($_GET) 和以下网址:

      输出永远是:

      array(1) { ["id"]=> string(9) "issue.php" } 
      

      解决方案

      您有三个主要选项:

      1. 添加真实文件不被重定向的条件
      2. 仅重写数字,例如重写issue/123 但不是issue/abc
      3. 两者兼得

      方法一

      RewriteEngine ON
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^issue/(.*)/*$ issue/issue.php?id=$1 [L]
      

      方法二

      RewriteEngine ON
      RewriteRule ^issue/(\d*)/*$ issue/issue.php?id=$1 [L]
      

      方法3

      RewriteEngine ON
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^issue/(\d*)/*$ issue/issue.php?id=$1 [L]
      

      检索 ID

      这是最简单的部分......

      $issueid = $_GET['id'];
      

      【讨论】:

        【解决方案3】:

        您要查找的是 PATH_INFO $_SERVER 变量。

        来自http://php.net/manual/en/reserved.variables.server.php

        'PATH_INFO'

        包含任何客户端提供的路径名信息,尾随实际 脚本文件名,但在查询字符串之前(如果有)。为了 例如,如果当前脚本是通过 URL 访问的 http://www.example.com/php/path_info.php/some/stuff?foo=bar,然后 $_SERVER['PATH_INFO'] 将包含 /some/stuff。

        explode() 它并处理它的部分。

        编辑:使用重写规则将用户的请求 URL 映射到您的内部结构和/或隐藏脚本名称。但是PATH_INFO 转换为GET 查询,这完全没有必要!只需执行explode('/',$_SERVER['PATH_INFO']) 即可!

        另外,看到您自己的答案,您不需要任何preg_mathes。如果您的数据库仅包含数字 id,则给它一个非数字的 ID 将被拒绝。如果由于某种原因您仍需要检查字符串 var 是否具有数值,请考虑 is_numeric()

        保持简单。不要重新发明轮子!

        【讨论】:

          【解决方案4】:

          我尝试并尝试了.htaccess 方法,但无济于事。所以我尝试了一个 PHP 解决方案并想出了这个。

          问题.php

          <?php
          if (strpos($_SERVER['REQUEST_URI'], 'issue.php') !== FALSE){
              $url = split('issue.php/', $_SERVER['REQUEST_URI']);
          }elseif (strpos($_SERVER['REQUEST_URI'], 'issue') !== FALSE){
              $url = split('issue/', $_SERVER['REQUEST_URI']);
          }else{
              exit("URI REQUESET ERROR"); 
          }
          
          $id = $url[1];
          
          if(preg_match('/[^0-9]/i', $id)) {
              exit("Invalid ID");
          }
          ?>
          

          【讨论】:

            【解决方案5】:

            在您的 .htaccess 中,您应该添加:

            RewriteEngine On
            RewriteRule ^id/([^/]*)$ /get.php/?id=$1 [L]
            

            与之前提到的海报一样,请确保您的 mod_rewrite 已激活。

            【讨论】:

            【解决方案6】:

            您将需要mod_rewrite(或您平台上的等效项)将/get.php/id/123 重写为/get.php?id=123

            【讨论】:

              【解决方案7】:

              您必须使用一个名为 .htaccess 的文件,在 Google 上进行搜索,您会发现很多示例。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-29
                • 1970-01-01
                相关资源
                最近更新 更多