2010-06-22 42 views
2

当我点击了一个网站,我有一个给定的条目的注释部分做一个URL重写,网址如下:同时使用PHP GET方法

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方法执行此操作?

由于提前,

约翰

回答

0

不,你不能离开变量并期待他们反正通过。如果你这样做,信息不再在URL中,所以你没有办法得到它。

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

+0

如何进行POST时,到达评论部分的方式只是一个hyperl墨水? – John 2010-06-22 08:32:38

+0

@约翰:你不能。 – 2010-06-22 08:54:25

3

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

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

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

您可以在.htaccess文件用一个简单的重写规则做到这一点,就像这样:

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

谢谢......在我看到您的评论之前,我实际上自己提出了这个想法。我想我会走这条路。 – John 2010-06-22 09:37:47

0

我加盟Sjoerd这个词,但有很多方法可以像你想要的那样重写你的url!

Apache和(IIS太)支持网址,就像这样: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 

当然,你可以重写你的URL像FRKT说:)

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

+0

这不是很漂亮。为什么不使用mod_rewrite(或IIS的等价物)? – 2010-06-22 09:00:00

+0

为什么它不漂亮?这是他列出的问题的一个很好的解决方案。我认为它是一个非常有用的URL重写方式,另一件事,现在他有一个新的方面如何做到这一点,只使用php – 2010-06-22 09:17:05

+0

我不确定这属于URL重写的类别,但我同意它对于不能使用mod_rewrite的人来说,这是一个很好的选择。 :-) – 2010-06-22 10:50:12