2011-11-02 138 views
0

我的网站当前显示这样的(上点击广告时):如何让这个例子让我的网站更友好?

hxxp://mysite.com/viewItem.php?id=10 

我喜欢的网址为:

hxxp://mysite.com/dogs/121/border-collie-for-sale-to-good-home 

,其中“狗”永远是一个常数,121总是$ row ['postId'];和“边境牧羊犬出售至好家园”总是我的$ ['title'];

我知道这可能不会像在这里的快速答案那么容易,但如果你能让我走向正确的方向,将不胜感激。我假设.htaccess的更改是按顺序进行的,我试图破译该文件非常糟糕。

+0

mapfiles将对此有所帮助 – david

+0

mapfiles?我很确定这是一个htaccess问题,但是mapfiles是什么? – Andi

+0

http://httpd.apache。org/docs/current/mod/mod_rewrite.html#rewritemap – david

回答

0

你可以做的事情是在viewItem.php脚本的顶部添加一个重定向。该重定向将需要检查用于指示.htaccess文件被重写的查询参数。事情是这样的:

if(!isset($HTTP_GET_VARS['rewritten'])) { 
    // use whatever behind the scenes stuff you need to construct the friendly URL 
    $friendly_url = "http://mysite/" . getCategory() . "/" . getID() . "/" . getTitle(); 

    // Now redirect the browser: 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: $friendly_url"); 
    exit(); 
} 

// business as usual, the rest of your viewItem.php script. 

所以,当这个PHP脚本尝试处理不具有的查询字符串参数rewritten的请求,将其重定向到URL的友好版本。如果它具有rewritten它通常会执行并处理请求。

现在在.htaccess文件中,你想重写友好URL的丑陋URL,但是你需要在重写中包含rewritten(我假设你的例子中的“121”是viewItem的“id” .PHP脚本有:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^[^/]+/([^/]+)/ /viewItem.php?id=$1&rewritten=true [L] 

如果你离开了&rewritten=true那里,它会进入一个重定向循环也可以在规则的括号内添加QSA,如果你想传递下去其他查询字符串。重写以防万一你想能够处理友好的URL,如:http://mysite/dogs/121/border-collie-for-sale/?sort=asc With [L,QSA],“sort = asc”被传递给viewItem/php。

所以这就是现在发生的事情,当有人点击广告和被采取http://mysite/viewItem.php?id=121

  1. 浏览器的地址栏中说http://mysite/viewItem.php?id=121请求被发送到mysite的和viewItem.php访问
  2. 顶部viewItem.php的看到,没有rewritten PARAM,所以浏览器重定向到http://mysite/dogs/121/border-collie-for-sale
  3. 因为这是一个301重定向,浏览器的地址栏更改为http://mysite/dogs/121/border-collie-for-sale
  4. 热曲est被重新发送给mysite,但是这一次,.htaccess会将/dogs/121/border-collie-for-sale重写为/viewItem.php?id=121&rewritten=true INTERNALLY,因此浏览器的位置栏不会更改。
  5. 请求使它回到viewItem.php,此时,脚本看到有一个rewritten参数,并执行它的平常业务和请求送达

您可以使用任何名称为参数只要没有任何脚本正在使用它,就可以使用标志。