动机:我正在构建自己的简单cms。但是当我为我的帖子做htaccess时,当我想在id传递url后添加文本时,我会陷入困境。
到目前为止,我所尝试的是:
RewriteRule ^blog/(.+)$ post.php?id=$1
问题是,当我输入http://example.com/blog/1
时,我收到了帖子。但是当我去http://example.com/blog/1/hello-world
时它不起作用。
我想将文本hello-world添加到永久链接以用于SEO目的。
答案 0 :(得分:1)
RewriteRule下面对我来说很好。
RewriteRule ^blog/([0-9]+)/(.*)?$ blog_detail.php?id=$1&title=$2 [L]
答案 1 :(得分:1)
除了在.htaccess中编写正则表达式之外,您还可以将所有URL路由到一个PHP脚本,就像Wordpress一样:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
然后,在index.php中,您可以将$ _SERVER [&#39; REQUEST_URI&#39;]拆分为零件并按照您的意愿处理,如下所示:
$parts = explode("/", $_SERVER['REQUEST_URI']);
if($parts[1]==="blog")
{
$id = intval($parts[2]);
include("post.php");
die();
}
答案 2 :(得分:0)
由于你的“丑陋”网址不使用标题,你可以简单地匹配它,但忽略它。您当前正在第一个捕获组中匹配1/hello-world
,而post.php页面显然无法处理此问题。而是匹配以下内容:
RewriteRule ^blog/([^/]+)/[^/]+$ post.php?id=$1 [L]
编辑:有人声称这种方法效率低下。我不敢苟同。您可以在php中执行以下操作,以重定向使用不正确的URL完成的请求。它与$_GET['title']
和$expectedtitle
的比较完全一样有效,然后构建网址。不同之处在于您没有无用的变量,并且此代码的意图很明确。如果网址不是预期的网址,您想要重定向用户。预期的标题不是实际的标题是副产品。
$expectedtitle = getTitleById( $_GET['id'] );
$expectedurl = "{$_GET['id']}/{$expectedtitle}";
if( $_SERVER['REQUEST_URI'] != $expectedurl ) {
header( $expectedurl, TRUE, 301 );
}