我有这样的网址:
http://domain.com/index.php?id=223
这个.htaccess代码:
RewriteEngine On
RewriteRule ^([^/]*)\.html$ /index.php?id=$1 [L]
根据我的理解,这应该输出:
http://domain.com/223.html
但它没有做任何事情,有人可以解释一下这是如何运作的以及我做错了什么?
答案 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.php
或cookies
之前,下面的代码会进入顶部的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
(永久重定向)。