0

从过去 3 小时开始,我正在尝试这个 301 url 重定向,但它没有按预期工作。请帮我解决一下这个。这是 .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”

我不知道如何解决这个问题。如果您能指导我,我将不胜感激。

4

4 回答 4

1

我认为这是因为您正在使用(.*)/(.*).

这是我一直使用的:

<IfModule mod_rewrite.c>
    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . index.php [QSA,L]
</IfModule>

所有 URL 都由 PHP 开始检查和重写(如果您想要速度,也可以使用 nginx),但 .htaccess 必须是干净的。易于阅读,易于重写(到 nginx 或其他服务器)。

索引.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;
}
于 2013-06-01T19:06:12.090 回答
0

查看重定向指令文档: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]

简单的

于 2013-06-01T19:14:28.707 回答
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]”并粘贴在所有重写规则之上,它起作用了。我猜它与其他一些重写规则重叠。但最后,它按我的预期工作。

再次感谢大家。:-)

于 2013-06-02T09:27:51.343 回答
0

我不确定为什么它在 url 之后附加“?id=74&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]
于 2013-06-01T23:29:48.423 回答