使用PHP GET方法执行URL重写

时间:2010-06-22 08:24:43

标签: php .htaccess url-rewriting

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

  

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

我想让它看起来像这个网址:

  

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

据我所知,这涉及到.htaccess文件中添加规则。我有两个问题:

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

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

  3. 提前致谢,

    约翰

3 个答案:

答案 0 :(得分:3)

我不确定为什么你需要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

答案 1 :(得分:0)

不,你不能把变量留出来并期望它们无论如何都要传递。如果您这样做,则信息不再出现在URL中,因此您无法获取该信息。

如果您希望传递变量而不显示变量,则可以使用post而不是get。

答案 2 :(得分:0)

我加入了Sjoerd的话,但是有很多方法可以像你想的那样重写你的网址!

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;
}

这很有效,但你也需要定义基本网址,这需要在文件的开头调用,并在每个图像,脚本等调用时实现。

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一样重写你的网址:)

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