【问题标题】:Doing a URL re-write while using PHP GET method使用 PHP GET 方法进行 URL 重写
【发布时间】:2011-03-06 16:58:46
【问题描述】:

当我在我拥有的网站上单击给定条目的评论部分时,URL 如下所示:

http://www...com/.../comments/index.php?submission=Portugal%20Crushes%20North%20Korea&submissionid=62&url=nytimes.com/2010/06/22/sports/soccer/22portugalgame.html?hpw&countcomments=3&submittor=johnjohn12&submissiondate=2010-06-21%2019:00:07&dispurl=nytimes.com

我想让它看起来像这个 URL:

http://www...com/.../comments/Portugal-Crushes-North-Korea-62

我了解这涉及向 .htaccess 文件添加规则。我有两个问题:

  1. 由于我在 PHP 中使用 GET 方法,丑陋的 URL 附加了一堆变量。我不希望所有这些变量都出现在干净的 URL 中。是否可以在干净的 URL 中只包含一些变量,但仍然有一条规则将其指向包含所有变量的丑陋 URL?

  2. 写完 .htaccess 规则后,是否要返回并更改源代码中的链接以指向干净的 URL?如果是这样,当干净的 URL 没有我想要传递的所有变量时,我该如何使用 GET 方法执行此操作?

提前致谢,

约翰

【问题讨论】:

    标签: php .htaccess url-rewriting


    【解决方案1】:

    不,您不能忽略变量并期望它们无论如何都会被传递。如果您这样做,则该信息不再在 URL 中,因此您无法获取它。

    如果你想传递变量而不显示在 URL 中,你可以使用 post 而不是 get。

    【讨论】:

    • 当到达 cmets 部分的方式只是一个超链接时,我如何进行 POST?
    【解决方案2】:

    我不确定您为什么需要 URL 中的所有数据。您应该将提交标题、日期和作者等内容存储在数据库中,然后使用 ID 引用它。这样,您的网址会更短更漂亮:

    http://www.example.org/article.php?id=1

    http://www.example.org/article/1/

    您可以在 .htaccess 文件中使用简单的 RewriteRule 来完成此操作,如下所示:

    RewriteEngine On
    RewriteRule ^articles/([0-9]+)/    article.php?id=$1
    

    【讨论】:

    • 谢谢...在我看到您的评论之前,我自己提出了这个想法。我想我会走这条路。
    【解决方案3】:

    我加入了 Sjoerd 的说法,但是有很多方法可以让你随心所欲地重写你的 url!

    Apache 和(IIS 也是)支持这样的 url-s:http://example.com/index.php/my-rewritten-url_62

    function URISegment($segment)
    {
        $uri_array = explode('/',$_SERVER['REQUEST_URI']);
        $uri_count = count($uri_array);
        $returning_uri = array();
    
        for($i = 0;$i<$uri_count;$i++)
        {
            if(empty($uri_array[$i]) || $uri_array[$i] == "index.php")
                unset($uri_array[$i]);
            else
                array_push($returning_uri,$uri_array[$i]);
        }
    
        if($segment < count($returning_uri))
            return $returning_uri[$segment];
        else
            return false;
    }
    

    这可行,但您也需要定义基本 url,这需要在文件开头调用,并在每个图像、脚本等调用时实现。

    function BaseURL()
    {
        if(isset($_SERVER['HTTP_HOST']))
        {
            $base = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ? 'https' : 'http';
            $base .= '://'. $_SERVER['HTTP_HOST'];
            $base .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
        }
        else
        {
            $base = 'http://localhost/';
        }
        return $base;   
    }
    

    在这之后你可以用这个来代替:

    // http://example.com/?MyKey=Some-data
    $MyKey = $_GET['MyKey']; //which is the first item
    echo $MyKey;
    // results: Some-data
    

    这个:

    // http://example.com/?MyKey=Some-data
    $MyKey = URISegment(0);
    echo $MyKey;
    // results: Some-data
    

    每个人都得到相同的结果。

    PS:

    我喜欢这个解决方案,因为我可以根据需要混合 url 类型:

    example.com/index.php/index/evaled-article?some=db-stored&code=snipplet
    

    当然你也可以像 FRKT 说的那样重写你的 url :)

    当然,如果你想隐藏index.php你需要使用mod_rewrite,因为没有办法

    【讨论】:

    • 那不是很漂亮。为什么不使用 mod_rewrite(或 IIS 的等价物)?
    • 为什么不漂亮?对于他列出的问题,这是一个很好的解决方案。我认为这是一种非常有用的 url 重写方式,另外,现在他有了一个新的方面如何做到这一点,只使用 php
    • 我不确定这是否属于 URL 重写的范畴,但我同意它对于无法使用 mod_rewrite 的人来说是一个不错的选择。 :-)
    • @Nort - 我知道这是旧的,但我只是想补充一下我的想法......“漂亮的 URL”通常意味着它们更容易让网站用户记住或只是让它们更好,像这样:example.com/user.php?id=1234567 不如 example.com/user/1234567 好,这可以通过 mod_rewrite 和其他 URL 重写技术来完成。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2016-05-08
    相关资源
    最近更新 更多