【问题标题】:PHP Url Routing separate DirPHP Url 路由单独目录
【发布时间】:2016-04-16 20:54:15
【问题描述】:

我正在为我的网站寻找一个 PHP 路由器,并且我的文件位于根目录中;例如:index.php、details.php、signup.php、recover.php

所以我希望 details.php、signup.php 和 recover.php 在名为 pages 的目录中,然后访问 mysite.com/details.php 上的链接而不是 mysite.com/details 或 mysite.com/?page =details...我真的想把它们放在一个单独的文件夹而不是根目录中。

谢谢大家!

【问题讨论】:

    标签: php url routing


    【解决方案1】:

    您只需要一个 MVC。 我强烈建议您遵循本教程系列。未使用任何框架,但仍在工作。

    https://www.youtube.com/watch?v=OsCTzGASImQ&list=PLfdtiltiRHWGXVHXX09fxXDi-DqInchFD

    【讨论】:

      【解决方案2】:

      几年前我写了一个脚本,我认为它可能很适合您的需求。

      注意事项:

      • 脚本由顶部的 location 模式控制。
        我对其进行了修改(只是在模式中插入了 pages/)以适合您的情况,我希望。
      • 您可以用此脚本替换所有要移至目录页面的文件 - 无需任何修改。
      • 脚本自动处理大部分 URI 元素,包括端口号。但是:它不处理登录凭据(用户名和密码),因为许多现代浏览器和服务器不支持这些。
      • 此外,此脚本受版权保护,它是免费软件。因此,您可以在非商业和商业环境中使用它。

      代码

          <?php
          /*
           ---------------------------------------------------------------------------
           Redirector Script
           Copyright (C) 2008, methodica.ch, http://www.methodica.ch
           Purpose: Redirect GET request according the pattern 'location'
           Pattern variables (embraced in curly brackets):
             prot: Protocol (i.e. http | https)
             host: Hostname (e.g. www.example.org)
             port: Portnumber (80 | 443 | 81)
             path: Path to the file (includes trailing '/', might be empty)
             file: Filename
             quer: Query, GET parameters (e.g. 'id=myId&mode=1&close=automatic')
           Other text is taken literally
           ---------------------------------------------------------------------------
          */
          define('location','{prot}://{host}{port}/{path}pages/{file}{quer}');
      
          // Do not modify the code below! -------------------------------------------
      
          // Get URI elements
          $prot = ((isset($_SERVER['HTTPS'])) && (strtoupper($_SERVER['HTTPS']) == 'ON')) ? 'https' : 'http';
          $server_name = getenv('SERVER_NAME');
          $script_url  = $prot . '://' . $server_name . ':' . getenv('SERVER_PORT') . $_SERVER['PHP_SELF'];
          $xres = preg_match_all('%^(http[s]{0,1})://(.*?):[\d]*?/(.*/)*(.*)$%i', $script_url, $res, PREG_PATTERN_ORDER);
      
          if (($xres!==false) && ($xres>0)) {
              // Prepare variables
              $prot = $res[1];
              $host = $res[2];
              $path = $res[3];
              $file = $res[4];
              $quer = $_SERVER['QUERY_STRING'];
              $xport = getenv('SERVER_PORT');
              $port = ($prot=='https') ? ( ($xport=='443') ? '' : ":$xport" ) : ( ($xport=='80') ? '' : ":$xport" );
              $location = location;
              // Replace variable references in pattern
              preg_match_all('/\{.*?\}/i', $location, $res, PREG_PATTERN_ORDER);
              for ($i = 0; $i < count($res[0]); $i++) {
                  $varname = str_replace(array('{','}'),'',$res[0][$i]);
                  $srce = $res[0][$i];
                  $dest = $$varname;
                  if (is_array($dest)) $dest = ($dest[0]);
                  if ($srce=='{quer}') $dest = '?'.$dest; 
                  $location = str_replace($srce,$dest,$location);
              }
              // Send redirection header
              header("Location: $location");
              exit();
          } else {
              // Something went awfully wrong
              echo "ERROR: Cannot parse URI:<br />'$script_url'";
              exit();
          }
      
          ?>
      

      【讨论】:

      • 谢谢,它可以工作,但在浏览器的 url 字段中显示了整个路径,例如:xxx.xxx.xxx.xx/pages/details.php
      • 没错,当通过浏览器发出重定向时,总是如此。而且,这有什么关系?用户是否应该看不到他/她已被重定向?如果是这种情况,脚本必须透明地通过请求并将结果作为自己的结果返回给用户。这可以做到——但我不建议这样做,因为这是开销。对移动到 pages 目录的元素的每个请求(包括图片等)都是两步访问。
      • 另一种选择是安装一种“反向”代理,它会过滤请求并为配置的 URL 进行传递。存在这样的解决方案(硬件+软件)并且非常昂贵。然而,从头开始编写这样的代理本身就是一个项目。
      • 最后,在根目录的 .htaccess 文件中设置重定向规则。这些重定向也会显示在浏览器的 URL 字段中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多