我在项目中使用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.html
等something.html
。
但是如果我在浏览器中运行http://domain.com/somename.html
,我什么也得不到,因为我似乎无法访问$url = preg_replace('#[^0-9]#i', '', $_GET['url']);
为了使这项工作有用,我需要使用smarty PHP或htaccess文件吗?
任何帮助都会受到赞赏。
答案 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添加到重写的网址即可。