.htaccess在变量后添加文本

时间:2014-11-28 08:53:44

标签: php .htaccess

动机:我正在构建自己的简单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目的。

3 个答案:

答案 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 );
}