0

我的 .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^-([0-9]+) /simpleblog/index.php?post_id=$1

这就是格式化链接的方式。

<a href = "index.php?post_id=<?php echo $post['posts_id']; ?>-<?php echo $post['title']; ?>"><?php echo $post['title'];?></a>

现在链接是这样的:

http://localhost/simpleblog/index.php?post_id=15-First%20Post

我希望链接是这样的:

http://localhost/simpleblog/post/First-Post

我是使用 .htaccess 的新手。我不知道如何正确使用它。那么如何按照我想要的方式制作链接呢?

4

3 回答 3

1

事情不会按照您尝试实施的方式进行:

您想在网络浏览器中看到的 url 没有说明数字 id。当然可以在语法级别上将该 url 重写为您想要的任何内容。但是重写模块无法猜测具有该标题的帖子的数字 id 为 15。这不能凭空挑选。

因此,要么您必须接受一些数字 id 作为您发布的 url 的一部分,要么您必须实现一个能够通过字母数字标题引用帖子的例程。但是,考虑到帖子标题可能在此类字母数字参考中包含各种特殊字符等,很容易出错。这就是为什么大多数网站使用两者的组合:数字 id 和字母数字标题。标题被重写模块静默删除,而数字 id 是内部用于引用帖子的内容。

于 2013-01-20T10:13:39.450 回答
1

根据您对15示例中关于参数的问题的评论,我的结论是post/First-PostURL 段确实包含 3 个不同的参数,par1par3此答案中调用。

如果这是正确的,你可以试试这个:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} .*/([^/]+)/([^-]+)-([^/]+)/?  [NC]
RewriteRule .*  simpleblog/index.php?post_id=%1-%2_%3   [L]

静默地图

http://localhost/simpleblog/par1/par2-par3(这是在浏览器栏中输入的 URL)

http://localhost/simpleblog/index.php?post_id=par1-par2_par3

在您的问题中,par2 和 par3 之间有一个空格 (%20),它在重定向查询中被替换为_以避免出现问题。

如果您确实需要空间,请index.php使用如下代码进行转换:

<?php  
if (isset ($_GET['post_id']) ) {
$PostId = $_GET['post_id'] ; 
$PostId = str_replace('_',' ',$PostId);
echo $PostId . "<br /><br />";  // Test
}
?>
于 2013-01-21T03:36:16.093 回答
0

您正在尝试创建 SEF(搜索引擎友好)网址,我认为最好的方法是在您的数据库上创建一个表:

sef_urls(original_url,sef_url) 

您存储原始 url (index.php?post_id=15-First%20Post) 和您想要的 sef url (post/First-Post) 的位置,然后在 .htaccess 中:

RewriteRule ^(.*)$ index.php [F,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

在您的 index.php 中,您查询您的数据库表以了解原始 url 是什么。例如,我写:

localhost/simpleblog/post/First-Post

index.php 会:

$requested_url="..";
$result=mysql_query("SELECT original_url FROM sef_urls WHERE sef_url=$requested_url");
if($row=mysql_fetch_array($result)){//is this SEF url a known url?
   include($row['original_url'];
}else{
   //404 not found
}
于 2013-01-20T10:27:44.263 回答