我有一个这样的网址:
http://domain.com/index.php?id=223
而这个 .htaccess 代码:
RewriteEngine On
RewriteRule ^([^/]*)\.html$ /index.php?id=$1 [L]
据我了解,这应该输出:
http://domain.com/223.html
但它什么也没做,有人可以解释一下这是如何工作的以及我做错了什么吗?
我有一个这样的网址:
http://domain.com/index.php?id=223
而这个 .htaccess 代码:
RewriteEngine On
RewriteRule ^([^/]*)\.html$ /index.php?id=$1 [L]
据我了解,这应该输出:
http://domain.com/223.html
但它什么也没做,有人可以解释一下这是如何工作的以及我做错了什么吗?
除了您在 .htaccess 中已有的内容之外,您还需要一个用于外部重定向/index.php?id=223
to的规则/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
. R=301
在测试你的 mod_rewrite 规则时避免使用(永久重定向)。
您的原始规则采用任何不包含斜杠并在根级别以“.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
之前进入顶部的文件。作为你可以做什么的一个例子......我只是在猜测表结构: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);
}
}
}
}
?>