从最近3个小时开始,我正在尝试这个301网址重定向,但它没有按预期工作。请帮我解决一下这个。这是.htaccess文件代码。
Options +FollowSymLinks +SymLinksIfOwnerMatch -MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]
RewriteBase /
rewriterule ^(.*)/(.*)\.html$ product.php?id=$1&name=$2 [L]
rewriterule ^deals/(.*)$ details.php?id=$1 [L]
rewritecond %{SERVER_PORT} 80
rewritecond %{REQUEST_URI} publisher.php
Redirect 301 /deals/74/product-name.html http://mydomain.com/74/product-name.html
每当我输入www.mydomain.com/deals/74/product-name.html时,它会将我重定向到“www.mydomain.com/deals/74/product-name.html?id=74&name=product -name“
我不确定为什么在url之后附加“?id = 74& name = product-name”?我只想显示“www.mydomain.com/deals/74/product-name.html”
我不知道如何解决这个问题。如果你可以指导我,我将不胜感激。
答案 0 :(得分:1)
我认为这是因为你正在使用(.*)/(.*)
。
这就是我经常使用的:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [QSA,L]
</IfModule>
所有URL都由PHP开始检查和重写(如果你想要速度,可以使用nginx),但.htaccess必须干净。读取简单,重写简单(到nginx或其他服务器)。
的index.php:
if (substr($_SERVER['HTTP_HOST'], 0, 4) != 'www.'){
$protocol = (substr(PHP_SAPI, 0, 3) == 'cgi' ? 'Status:' : $_SERVER['SERVER_PROTOCOL']);
header($protocol.' 301 Moved Permanently');
header('Location: http://www.example.com'.$_SERVER['REQUEST_URI']);
exit;
}
// Simple path checker
$uri = trim($_SERVER['REQUEST_URI'], '/');
$path = pathinfo($uri);
// Check
if ($path['extension'] == '.html'){
$_GET['id'] = $path['dirname'];
$_GET['name'] = $path['filename'];
include 'product.php';
exit;
}
if ($path['dirname'] == 'deals'){
$_GET['id'] = $path['filename'];
include 'details.php';
exit;
}
答案 1 :(得分:0)
查看Redirect指令文档:http://httpd.apache.org/docs/current/mod/mod_alias.html#redirect
你可以看到:
如果客户请求http://example.com/service/foo.txt,则会被告知要访问 而是http://foo2.example.com/service/foo.txt。这包括使用GET参数的请求, 例如http://example.com/service/foo.pl?q=23&a=42,它将被重定向到 http://foo2.example.com/service/foo.pl?q=23&a=42。请注意,POST将被丢弃。
配置中的最后一条规则是:
Redirect 301 /deals/74/product-name.html http://mydomain.com/74/product-name.html
mod_alias将附加所有GET参数
如果您不想追加GET参数,可能您可能会更改重写规则的重定向规则 类似的东西:
Rewrite ^/deals/74/product-name.html http://mydomain.com/74/product-name.html [R=301]
轻松
答案 2 :(得分:0)
我不确定为什么在url之后附加“?id = 74&amp; name = product-name”?
这样做是因为您的URI /deals/74/product-name.html
符合以下规则:
RewriteRule ^(.*)/(.*)\.html$ product.php?id=$1&name=$2 [L]
和
Redirect 301 /deals/74/product-name.html http://mydomain.com/74/product-name.html
将 mod_alias和mod_rewrite混合在一起并不是一个好主意。最好使用mod_rewrite本身进行更细致的控制。
您修改后的.htaccess:
Options +FollowSymLinks +SymLinksIfOwnerMatch -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]
RewriteRule ^deals/(74/product-name\.html)$ /$1 [L,R=301,NC]
RewriteCond %{REQUEST_URI} !/74/ [NC]
RewriteRule ^([^/]+)/([^.]+)\.html$ /product.php?id=$1&name=$2 [L]
RewriteRule ^deals/(.*)$ /details.php?id=$1 [L]
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} /publisher.php [L]
答案 3 :(得分:0)
首先感谢所有回复并试图帮助我的人。花了大概。整整一天弄清楚自己的解决方案。我希望我的回答能帮助别人,
Options +FollowSymLinks +SymLinksIfOwnerMatch -MultiViews
RewriteEngine On
RewriteBase /
RewriteRule ^deals/74/product-name.html$ 74/product-name.html [R=301,L]
RewriteCond %{HTTP_HOST} ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]
RewriteRule ^(.*)/(.*)\.html$ product.php?id=$1&name=$2
rewritecond %{SERVER_PORT} 80
rewritecond %{REQUEST_URI} publisher.php
RewriteRule ^(.*)$ publisher.php [L]
我把最后一行“RewriteRule ^ deals / 74 / product-name.html $ 74 / product-name.html [R = 301,L]”并粘贴在所有重写规则之上并且它有效。我猜它与其他一些Rewrite规则重叠。但最后,它按照我的预期工作。
再次感谢大家。 : - )