0

我有一个这样的网址:

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

而这个 .htaccess 代码:

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

据我了解,这应该输出:

http://domain.com/223.html

但它什么也没做,有人可以解释一下这是如何工作的以及我做错了什么吗?

4

2 回答 2

0

除了您在 .htaccess 中已有的内容之外,您还需要一个用于外部重定向/index.php?id=223to的规则/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=302R=301. R=301在测试你的 mod_rewrite 规则时避免使用(永久重定向)。

于 2013-05-18T14:40:27.477 回答
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>

对于 SEO,您可以取消开始比赛

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

这将使您可以引用如下文件:

/somedirectory/someseotitle/223.html

此外,您应该从所有id=$id链接创建 301 重定向,并使用完整的 URL 使它们转到预期的目标。下面的代码将在任何设置或启动index.php之前进入顶部的文件。作为你可以做什么的一个例子......我只是在猜测表结构:cookiessessions

<?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);

            }
        }

    }
}

?>
于 2013-05-17T23:42:21.403 回答