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

Php 使用.htaccess文件创建用户友好的URL,php,.htaccess,url-rewriting,Php,.htaccess,Url Rewriting,我在同一个目录下有两个php文件posts.php和postdetails.php。posts.php页面列出了所有帖子,当postid设置为:postdetails.php?id=3 我想让posts和postdetails页面在不使用.php的情况下可以访问,并添加一个尾部正斜杠,如: 而不是 www.domain.com/posts.php 我会: www.domain.com/posts/ 我用了这个: RewriteEngine On RewriteCond %{REQUEST_FIL

我在同一个目录下有两个php文件
posts.php
postdetails.php
posts.php
页面列出了所有帖子,当
postid
设置为:
postdetails.php?id=3

我想让
posts
postdetails
页面在不使用
.php
的情况下可以访问,并添加一个尾部正斜杠,如:

而不是
www.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/

我用这个函数来创建我的slug

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;
}
有什么帮助吗?

创建一个带有索引文件的目录帖子(显示帖子列表,链接到漂亮的url)和此。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中,您可以评估参数
$\u GET['slug']

根据您的问题猜测,您可以在创建时将slug保存在数据库中,并使用该参数识别帖子(很可能总是唯一的,如果不使用某物作为日期,或者只是将id添加到它的末尾?)

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是您所在的页面(为了使其更友好,在您的情况下,这可能是posts或任何其他页面)id是下一个变量。但是,如果使用此变量,则创建的所有页面都必须使用这两个变量,因此需要重命名任何其他脚本以使用这些变量。当然,可以以类似方式添加更多

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

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

在这里,您可能会发现一些有助于解决此问题的方法有点混乱:前半部分告诉我们您已经成功地重写了一些请求。做得好。后半部分说您希望更改生成的请求中的链接HTML指向这些漂亮的URL,但在代码上有一些未指明的问题,你没有向我们展示。最后,你展示了一个复杂的函数来创建slug,它似乎与上述任何一个问题都无关。底线:分解你的问题,一次只解决一部分。我想提醒大家的关键是writeRules不会让丑陋的URL变得美丽,他们会让美丽的URL变得丑陋:你把一个美丽的URL放在一些HTML中,用户点击它,Apache必须找出它对应的丑陋URL。你还可以制定重写规则,将URL的所有变体重定向到“最漂亮”的URL一个目前有效,但这只是一个整理步骤,因为如果你做得对,丑陋的URL无论如何都不应该发布。@是的,我知道这有点混乱。我想简单地完成的是:1.用斜杠
www.domain.com/posts/
2.postdetails URL变成
www.domain.com/posts/slug吗/需要注意的重要事项:这两个文件
posts.php
postdetails.php
都在同一个目录中,它们仍然只是目标,而不是单独的任务。坦率地说,你不能仅仅“拥有一个URL”,您可以在一些PHP中创建它,另外,您可以在一些Apache配置中阅读它。在使用PHP创建HTML链接时,您不需要考虑重写规则-只需知道,在某个阶段,您将修复这些链接以正确加载;反之亦然,同时确保
www.example.com/posts/foo/
加载正确的内容,您无需考虑如何生成包含该链接的HTML。然后,只需使用数据库将该段代码翻译回id中,或者确保该段代码对所有帖子都是唯一的,并使用它来选择键。我已根据您的需要更改了答案