使用smarty php的SEO友好URL?

时间:2014-05-21 12:01:09

标签: php mysql .htaccess smarty

我在项目中使用smarty PHP。

通常我会在smarty中使用以下代码来创建链接并将它们指向特定的网址:

在我聪明的模板页面中:

{section name=title loop=$title}
<li><a class="nav" href="index.php?url={$title[title].url}">{$title[title].title}</a></li>
{/section}

上面的代码将生成以下网址:

http://domain.com/index.php?url=somename.html

somename.html存储在mysql数据库中。

在我的index.php文件中,我得到url = someone.html的详细信息,如下所示:

在我聪明的模板页面中:

{if isset($smarty.get.url)} 


  {$body}

  {/if}

在我的php页面中:

if(isset($_GET['url']))
{
    include "config/connect.php";

    $url = preg_replace('#[^0-9]#i', '', $_GET['url']);
    $url=mysqli_real_escape_string($db_conx, $_GET['url']);
if ($stmt = mysqli_prepare($db_conx, "SELECT id, url, title, body FROM pages WHERE url=?")) {

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "s", $url);

    /* execute query */
    mysqli_stmt_execute($stmt);

    /* bind result variables */
    mysqli_stmt_bind_result($stmt, $id, $url, $title, $body);
    /* fetch value */
    mysqli_stmt_fetch($stmt);





$pageurl=$_GET['url'];
    /* close statement */
    mysqli_stmt_close($stmt);
}
}
/* close connection */
mysqli_close($db_conx);


$smarty->assign('id', $id);
$smarty->assign('url', $url);

$smarty->assign('title', $title);
$smarty->assign ('body', $body);   

到目前为止,一切正常。

我的问题是:

我正在尝试创建SEO友好的网址。

示例:

http://domain.com/index.php?url=somename.html

http://domain.com/somename.html

我在htaccess文件中有这段代码:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9-/]+).html$ index.php?url=$1
RewriteRule ^([a-zA-Z0-9-/]+).html/$ index.php?url=$1

上面的代码允许我转换http://domain.com/index.php?url=somename.html

http://domain.com/somename.html

,但

当我在浏览器中查看http://domain.com/somename.html时,我会看到一个空白页面,这意味着我无法获取somename.html的相关信息。

例如,如果我在浏览器中运行http://domain.com/index.php?url=somename.html,我会在页面中获得{$body}somename.htmlsomething.html

但是如果我在浏览器中运行http://domain.com/somename.html,我什么也得不到,因为我似乎无法访问$url = preg_replace('#[^0-9]#i', '', $_GET['url']);

为了使这项工作有用,我需要使用smarty PHP或htaccess文件吗?

任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

问题在于您的重写规则

RewriteRule ^([a-zA-Z0-9-/]+).html$ index.php?url=$1

.html中未包含(),因此$1包含.html之前的所有内容

e.g。 http://domain.com/somename.html被重写为http://domain.com/index.php?url=somename

答案 1 :(得分:1)

根据Pinoniq的答案,更好的重写规则是:

 RewriteRule ^([\w/]+\.html)$ index.php?url=$1

那应该捕获任何字母数字加上正斜杠,.html.逃脱以避免头痛。

或者,你也可以选择:

 RewriteRule ^([\w/]+).html$ index.php?url=$1.html

只需将.html添加到重写的网址即可。