【问题标题】:Pretty URLs with .htaccess带有 .htaccess 的漂亮 URL
【发布时间】:2014-09-24 16:37:46
【问题描述】:

我有一个网址http://localhost/index.php?user=1。当我添加这个.htaccess 文件时

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^user/(.*)$ ./index.php?user=$1

我现在可以使用http://localhost/user/1 链接。但是http://localhost/index.php?user=1&action=update 怎么样才能变成http://localhost/user/1/update 呢?

另外我怎样才能使这个网址 http://localhost/user/add ? 谢谢。抱歉,我对.htaccess 比较陌生。

【问题讨论】:

标签: php apache .htaccess mod-rewrite


【解决方案1】:

一种简单的方法是像这样只将一个变量传递给 index.php

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^(.*)$ index.php?data=$1 [QSA]

然后在您的 index.php 文件中执行此操作

$data = expload("/",$_GET['data']);
$user = $data[1];
$action = $data[2];

这适用于所有情况,当您尝试传递许多变量时,如果您执行类似的操作,它就不起作用

http://localhost/user/add/12/54/54/66

最后一个变量总是取值add/12/54/54/66

【讨论】:

  • expload 有一个不错的戒指。
【解决方案2】:

试试这个很简单!

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^game/([0-9]+)/([_-0-9a-zA-Z]+)/?$  index.php?user=$1&action=$2 [L,NC]

就是这样!!

【讨论】:

    【解决方案3】:

    既然你用 PHP 标记了这个,我会从我所做的事情中添加一点观点,它可能对你有帮助,也可能没有帮助。

    当然,您可以只在 .htaccess 中编写,但要注意顺序。例如,假设您有:

    RewriteRule ^user/([0-9]+)/update$ ./index.php?user=$1&action=update
    RewriteRule ^user/([0-9]+)$ ./index.php?user=$1
    

    那么它应该在收到时

    http://localhost/user/1/update

    http://localhost/index.php?user=$1&action=update

    而不是

    http://localhost/index.php?user=$1

    现在,我所做的是将所有内容推送到 index.php?q=$1

    RewriteRule ^(.*)$ index.php?q=$1
    

    然后我使用 index.php 来处理查询是如何分解的。所以假设有人进入

    http://www.example.com/user/18239810/update

    这会去

    http://www.example.com/index.php?q=user/18239810/update

    从那里,沿着第一个/ 展开查询字符串,得到user18239810/update

    这会告诉我我需要将18239810/update 传递给user 控制器。在该控制器中,我再次将参数分解为用户 ID 和命令,然后我可以打开命令来告诉如何加载页面,将用户 ID 作为参数传递给 update 函数。

    非常快速和肮脏的例子(index.php):

    <?php
    $getString = explode('/', $_GET['q'], 1);
    $controller = $getString[0].'Controller';
    require_once('/controllers/'.$controller.'.php');
    $loadedController = new $controller( $getString[1] );
    ?>
    

    当然,这意味着构造函数都必须接受一个字符串参数,该参数将被解析为可接受的值。您可以使用 explodes 和 switch 语句来做到这一点,始终默认返回标准首页,以防止基于随机猜测的未经授权的访问。

    【讨论】:

      【解决方案4】:

      如果你想转

      http://www.yourwebsite.com/index.php?user=1&amp;action=update

      进入

      http://www.yourwebsite.com/user/1/update

      你可以使用

      Options +FollowSymLinks
      RewriteEngine On
      
      RewriteRule ^user/([0-9]*)/([a-z]*)$ ./index.php?user=$1&action=$2
      

      查看 PHP 中的参数:

      <?php 
      echo "user id:" . $_GET['user'];
      echo "<br>action:" . $_GET['action'];
      ?>
      
      • .htaccess 中的括号是您以后可以调用的组。 1 美元、2 美元等。
      • 我添加的第一组 ([0-9]*) 意味着它将 获取任何数字(1、34 等)。
      • 第二组表示任意字符 (a、abc、更新等)。

      在我看来,这比 (.*) 更干净、更安全,这基本上意味着几乎任何东西都可以接受。

      【讨论】:

      • 谢谢,但是 user = empty 怎么样?例如localhost/index.php?user&amp;action=add。我怎样才能使它成为localhost/user/add
      【解决方案5】:

      你可以这样写:

      RewriteEngine On
      RewriteRule ^([^/]*)/([^/]*)$ /index.php?user=$1&action=$2 [L]
      

      【讨论】:

      • 我知道这是一个相当古老的答案。但只是想让它知道任何回到这里的人,这个链接早就死了。
      【解决方案6】:

      试试这个很简单:

      Options +FollowSymLinks
      
      RewriteEngine on
      
      RewriteRule index/user/(.*)/(.*)/ index.php?user=$1&action=$2
      
      RewriteRule index/user/(.*)/(.*) index.php?user=$1&action=$2
      

      【讨论】:

        【解决方案7】:

        对于/user/add,您需要执行单独的规则,因为您没有“中间参数”。所以:

        RewriteRule ^user/add$ ./index.php?action=add [L,QSA]
        

        然后您可以对包含附加参数的 URL 执行附加规则:

        RewriteRule ^user/([0-9]+)/([A-Za-z]+)$ ./index.php?user=$1&action=$2 [L,QSA]
        

        这将允许您对现有用户执行操作。例如。 /user/1/update

        【讨论】:

        • 谢谢。我要试试这个。
        • 啊该死的!我完全忘记了方括号!
        【解决方案8】:

        感谢@denoise 和@mogosselin 的想法。还有@stslavik 指出我的代码示例的一些缺点。

        我是这样做的:

        Options +FollowSymLinks
        RewriteEngine On
        
        RewriteRule ^user/([0-9]*)/([a-z]*)$ ./index.php?user=$1&action=$2
        RewriteRule ^user/([a-z]*)$ ./index.php?user&action=$1
        

        通过在链接localhost/user/1234/update 上使用var_dump($_GET); 我得到了

        array (size=2)
          'user' => string '1234' (length=4)
          'action' => string 'update' (length=3)
        

        localhost/user/add

        array (size=2)
          'user' => string '' (length=4)
          'action' => string 'update' (length=3)
        

        这是我的目标。我只会用 PHP 做一些其他的事情。

        【讨论】:

          猜你喜欢
          • 2018-04-06
          • 2012-05-07
          • 1970-01-01
          • 1970-01-01
          • 2012-05-28
          • 1970-01-01
          • 2021-07-01
          • 1970-01-01
          • 2023-02-26
          相关资源
          最近更新 更多