使用.htaccess文件创建用户友好的URL

时间:2014-05-04 12:38:43

标签: php .htaccess url-rewriting

我在同一目录posts.phppostdetails.php中有两个php文件。 posts.php页面会列出所有帖子,postdetails.php会在postid设置为postdetails.php?id=3时显示帖子:posts

我希望在不使用postdetails的情况下访问.phpwww.domain.com/posts.php页面,并添加一个正斜杠,如:

而不是 www.domain.com/posts/

我有:

RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/]+)/$ $1.php RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ RewriteRule (.*)$ /$1/ [R=301,L]

我用过这个:

posts.php

现在我可以按照我想要的方式访问www.domain.com/posts/,例如:www.domain.com/posts/postdetails.php?id=NUMBER

但现在所有帖子都显示为posts

的链接

问题是我希望他们也喜欢他们在id子目录中,但我似乎无法使其工作。

我还想将slug更改为postdetails.php?slug=this-is-a-post

这样我就会有类似www.domain.com/posts/this-is-a-post/的内容,并将其改为function createSlug($str) { if($str !== mb_convert_encoding( mb_convert_encoding($str, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32') ) $str = mb_convert_encoding($str, 'UTF-8', mb_detect_encoding($str)); $str = htmlentities($str, ENT_NOQUOTES, 'UTF-8'); $str = preg_replace('`&([a-z]{1,2})(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig);`i', '\\1', $str); $str = html_entity_decode($str, ENT_NOQUOTES, 'UTF-8'); $str = preg_replace(array('`[^a-z0-9]`i','`[-]+`'), '-', $str); $str = strtolower( trim($str, '-') ); return $str; }

我正在使用此功能创建我的slu ..

{{1}}

请帮忙吗?

2 个答案:

答案 0 :(得分:1)

使用索引文件创建目录帖子(显示帖子列表,链接到漂亮的网址)和 .htaccess

RewriteCond %{REQUEST_URI} ^/posts/[^/]+/.*$
RewriteRule ^/posts/([^/]+)/$ postdetails.php?slug=$1 [QSA,L]

漂亮的网址

in this pattern:
http://www.example.com/posts/slug/

e.g.:
http://www.example.com/posts/keywords-are-here/

在文件 postdetails.php 中,您可以评估参数$_GET['slug']

答案 1 :(得分:0)

从您的问题中猜测,您可以在创建时将数据库保存在数据库中,并使用该数据库来识别帖子(很可能始终是唯一的,如果不使用某些日期作为日期来使用它或只是将id添加到它的末尾?)。在你的posts.php文件中,然后你开始

if(isset($_GET['id'])) { //your post identifier, if this is set, show a post

  include("postdetails.php");

} else {

  //your posts code

}

在您的索引上,然后包含页面,如果它被调用:

if(isset($_GET['p'])) {
  include($_GET['p'] . '.php'); //include the page you want, it is a seperate php page
}

对于你的htaccess,你使用这样的东西(代码基于我自己使用的东西),其中$ p是你所在的页面(为了使它更友好,在你的情况下这将是帖子,或任何其他页面),id是下一个变量。但是,如果使用此选项,则您创建的所有页面都必须使用这两个变量,因此您需要重命名任何其他脚本以使用这些变量。当然,可以以类似的方式添加更多内容。

RewriteEngine On
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?p=$1&id=$2&actie=$3
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?p=$1&id=$2
RewriteRule ^([^/\.]+)/?$ index.php?p=$1

这可能不是最优雅的方式,但更有经验的用户也应该回答。