为什么这个.htaccess不起作用?

时间:2013-05-17 23:03:27

标签: .htaccess mod-rewrite

我有这样的网址:

http://domain.com/index.php?id=223

这个.htaccess代码:

RewriteEngine On
RewriteRule ^([^/]*)\.html$ /index.php?id=$1 [L]

根据我的理解,这应该输出:

http://domain.com/223.html

但它没有做任何事情,有人可以解释一下这是如何运作的以及我做错了什么?

2 个答案:

答案 0 :(得分:0)

您的原始规则会获取任何不包含斜杠的文件,并在根级别以“.html”结尾(包括名为“.html”的文件),并将请求重定向到名为index.php的文件,并且需要来自请求的文件名的第一部分(在点之前)并将其作为名为“id。”的查询传递。

RewriteRule ^([^/]*)\.html$ /index.php?id=$1 [L]

由于这是.htaccess,你应该删掉斜杠

你应该这样做:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)\.html$ /index.php?id=$1 [L]

在链接中的html中,您需要调用filename.html。

<a href='/223.html'>Some page with an id of 223</a>

对于搜索引擎优化,你可以开始比赛

RewriteRule ([^/]+)\.html$ /index.php?id=$1 [L]

这样就可以引用像:

这样的文件
/somedirectory/someseotitle/223.html

此外,您应该从所有id=$id链接创建301重定向,并使用完整的URL转到目标目标。在设置index.phpcookies之前,下面的代码会进入顶部的sessions文件。作为你可以做的事情的一个例子......我只是猜测表结构:

<?php

if ($_SERVER['REQUEST_URI']=='/index.php' && !empty($_GET['id']){
    if (is_numeric($_GET['id'])){
        $id = $_GET['id'];

        $cquery = "select count(*) from table where id = $id"; 
        $count = mysqli_result(mysqli_query($cquery),0);
        if($count == 1){
            $tquery = "select title from table where id = $id";
            $result = mysqli_query($tquery);
            while ($row=mysqli_fetch_array($result)){
                $title = urlencode($row['title']);

                $headerString = "Location: /$title/$id.html";

                header( "HTTP/1.1 301 Moved Permanently" );
                header($headerString);

            }
        }

    }
}

?>

答案 1 :(得分:0)

除了.htaccess中已有的内容之外,您还需要一个将/index.php?id=223外部重定向到/223.html的规则。这应该是你完整的.htaccess:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(?:index\.php|)\?id=([^&\s]+) [NC]
RewriteRule ^ /%1.html? [R=302,L]

RewriteRule ^([^.]+)\.html$ /index.php?id=$1 [L,QSA,NC]

验证一切正常后,将R=302替换为R=301。在测试mod_rewrite规则时,请避免使用R=301(永久重定向)。