.htaccess将所有页面重定向到新域


218

我将使用哪个重定向规则将要重定向到的所有页面olddomain.example重定向到newdomain.example

该站点的结构完全不同,因此我希望将旧域下的每个页面都重定向到新域索引页面

我认为这可以做到(在olddomain.example基本目录下):

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.example/ [R=301]

但是,如果我导航到,则会olddomain.example/somepage重定向到newdomain.example/somepage。我希望仅重定向到newdomain.example没有页面后缀的地方。

如何保留最后一部分?


8
为了节省时间,请向下滚动至最正确的最佳答案,即RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack 2015年

2
值得指出的是,特别是从SEO角度来看,将多对一重定向到索引/主页通常是一个坏主意。Google可能会将其视为Soft-404。
怀特先生,

Answers:


200

可能是这样的:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^OLDDOMAIN\.com$ [NC]
RewriteRule ^(.*)$ http://NEWDOMAIN.com [R=301,L]

嗯,您可以尝试重新加载浏览器吗?它甚至在这里用xampp重定向。我刚刚测试。

我的坏东西...确实可以用,我的托管服务还进行了其他一些重定向,这很有趣。谢谢!:)
Yuval Adam

25
不是RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]吗?
Jim Geurts 2012年

1
漫长的冬天之后,我编辑了代码,以便最终可以工作。(!正确的是重定向,如果平等的,没有什么不同,以OLDDOMAIN,这是问题)
卡拉

5
@JimGeurts仅当您想重定向不是newdomain的所有内容时。但是,在这种情况下,我们只想重定向olddomain。
卡拉

442

以下答案可能会导致无限重定向循环...

在这里,这一行将网址上的域名之后的所有内容重定向到新域名下的完全相同的副本:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

www.example.net/somepage.html?var=foo 重定向到 www.newdomain.com/somepage.html?var=foo


21
但这不会重定向每个请求,即使对于newdomain.com也是如此吗?在这种情况下,是否会导致两个重复的请求?
Bill Dami

33
问题是将所有内容重定向到主页
kravits88 2014年

28
虽然这不是问题的答案,但是我从SE来到这个问题,正是在寻求这个答案。谢谢 !!!
dav 2014年

我们如何做从子域到新域的重定向?
Sukhjinder Singh 2015年

2
有人可以回答比尔的问题吗?这不应该使用RewriteCond来防止重复的请求和/或不必要的重写吗?我想即使没有必要,每次重写也不会产生任何明显的影响。但是为什么呢。
安德鲁

80

为了澄清起见,在删除托管重定向之后,我的原始解决方案也有效:

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.com/ [R=301]

这将重定向到默认索引,这就是您的问题所在。为了清楚起见,由于您的陈述由于接近而直接针对于user968421的答案,因此当意图是重定向到新域上的相应文件名时,user968421的答案是正确的。
RationalRabbit

19

我为我的Wordpress博客使用的是.htaccess。它把HTTP://www.blah.example/asadHTTP://blah.example/asadHTTP://www.blah.example2/asad等,对HTTP://blah.example/asad 感谢所有其他答案我想通了。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^YOURDOMAIN\.example$ [NC]
RewriteRule ^(.*)$ https://YOURDOMAIN.example/$1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

2
我认为这是所有问题中最全面的答案:它可以保留每个页面的排名,并且对所有不是主要页面的域名都是万能的!有什么更好的办法吗?
nzn 2015年

1
这里的关键是,域重写规则来之前 WordPress的指数重写规则。
MrMoxy

14
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^olddomain.com$ [OR]
  RewriteCond %{HTTP_HOST} ^www.olddomain.com$
  RewriteRule (.*)$ http://www.newdomain.com/$1 [R=301,L]
</IfModule>

这对我有用


是的,这种方法既干净又不错!对我也很有效。
科迪'18

如果有的话,它将使用URl中的参数进行重定向-index.php?aa = 9会将参数携带到新域中
Darksymphony

13

有多种方法可以执行此操作以及进行各种重定向,以下列出了它们:

301(永久)重定向:将整个站点永久指向另一个URL。这是最常见的重定向类型,在大多数情况下很有用。在此示例中,我们将重定向到“ example.com”域:

# This allows you to redirect your entire website to any other domain
Redirect 301 / http://example.com/

302(临时)重定向:将整个站点指向另一个临时URL。当您拥有临时目标网页并计划在以后再切换回主目标网页时,这对于SEO很有用:

# This allows you to redirect your entire website to any other domain
Redirect 302 / http://example.com/

将index.html重定向到特定的子文件夹:

# This allows you to redirect index.html to a specific subfolder
Redirect /index.html http://example.com/newdirectory/

将旧文件重定向到新文件路径:

# Redirect old file path to new file path
Redirect /olddirectory/oldfile.html http://example.com/newdirectory/newfile.html

重定向到特定的索引页:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html

如果向第一个示例添加$ 1,则这样Redirect 301 / http://example.com/$1 原始站点的所有页面将被重定向到新站点根目录
Yassine Mokni

@YassinMK $1这里不是必需的,您正在考虑该RedirectMatch指令(但是您仍然需要定义一个捕获组以供$1参考)。
怀特先生'17

尽管所有这些Redirect指令都将像for一样进行重定向,而OP希望仅重定向到新站点的主页(尽管不建议这样做)。RedirectMatch如果您只想重定向到特定的URL,则可能需要使用该指令。
怀特先生'17

代替301,您还可以编写重定向永久/ h ttps://www.example.com,您可以在vhost文件中执行此操作
Yvon Huynh

但是,有关.htaccess的问题,为什么还要提及vhost文件?
RustyIngles

9

如果要从某个位置重定向到子域,可以使用:

Redirect 301 /Old-Location/ http://subdomain.yourdomain.com


这是最好的方法。因为很多网站托管者不允许.htaccess中使用RewriteEngine。无论如何这都很棒!
Sprinterfreak 2015年

您必须使用RewriteEngine进行重定向。您遇到问题的原因是RewriteEngine已经处于活动状态,您只需要重定向规则。我很高兴这有所帮助。
EmptySD

不对。它会跳过所有重写事件,并在使用时RewriteEngine On抛出500内部错误。这是一个非常受限制的Web空间。使用Redirect 301 / http://foo是唯一可能的应对方式。
Sprinterfreak

6

如果您要将旧站点重定向到的新域位于其他主机上,则只需使用 Redirect

Redirect 301 / http://newdomain.com

这会将所有请求从重定向olddomainnewdomain

Redirect指令将不起作用,或者Redirect loop如果newdomain和olddomain都在同一主机上,则可能会导致,这时您需要mod-rewrite根据请求的主机标头使用重定向。

RewriteEngine on


RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.com$
RewriteRule ^ http://newdomain.com%{REQUEST_URI} [NE,L,R] 

5

我的名声不允许我对答案发表评论,但是我只想指出,此处评分最高的答案有误:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com$1 [R=301,L]

$ 1之前应该有一个斜线,所以

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

3

我作为SymLinks的解决方案在服务器上不起作用,因此我在PHP中使用了If。

function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
$redirect = str_replace("www.", "", curPageURL());
$remove_http_root    = str_replace('http://', '', $redirect);
$split_url_array     = explode('/', $remove_http_root );


if($split_url_array[0] == "olddomain.com"){
    header("Location: http://www.newdomain.com/$split_url_array[1]");
    die();
}

2

这是较早版本的apache中的一个错误(因此也称为mod_rewrite),如果更改,则将路径前缀附加到重写的路径中。看这里

我认为它已在apache2 V2.2.12中修复,您需要使用一个特殊的标志,当我找到它时,我将在此处添加它((我认为这是无路径的NP)

RewriteRule ^(.*)$ http://newdomain.com/ [??]

我用头撞了近一个月
问号

2

从可用性的角度来看,如果您还随请求一起发送路径(即您现在拥有的内容),并让您的新站点处理它,那会更好:

您搜索了“ /产品”。

不幸的是,该页面不见了。您是否要访问“ / new_products”?

(更好的是,仍然可以自动执行此操作。)

对于一个较大的网站来说,这显然是很多编码和启发式操作,但是我认为这将在用户满意度方面获得回报(当您精心保存的梦想产品书签将您带到newdomain.com的首页时,令人沮丧)


对于所说的网站,由于整个网站已更改,这与无关紧要,但是您绝对正确。该网站应尽可能向后兼容。+1
Yuval Adam

2

如果要重定向以完成没有参数或页面的新的其他站点(域),请使用以下命令:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]

1
使用时,此功能将无法正常工作,.htaccess因为它根本不匹配文档根目录中的任何URL。它可以在服务器配置或VirtualHost上下文中工作。
怀特先生,

2

我尝试了user968421的答案和OP的解决方案,但浏览器弹出了结帐页面的安全错误。我不能告诉你为什么。

我们的房东(场地)也无法解决。

最终解决方案已接近完成,但对user968421的答案进行了一些细微调整(旁注:与OP不同,我试图重定向到相应的页面,而不仅仅是重定向到首页,因此我维护了$1user968421的反向引用(域名之后)回答):

RewriteEngine on
RewriteRule (.*) https://newdomain.com/$1 [R=301,L]

Host Gator文章推荐的htaccess重定向生成器中得到了一些调整(绝望的时间,绝望的措施,正确的吗?)。


2

像这样简单,并且不会携带从URL到新域的尾随查询。

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]

真正为我工作,需要一个解决方案,而不会将任何内容传递给新域感谢Dsynmphony
Faisal Mehmood Awan

1

使用条件重新导向; Options -FollowSymLinksAllowOverride -Options禁止由主控器,如果几个本地文件,应服过:

样本.htaccess

# Redirect everything except index.html to http://foo
<FilesMatch "(?<!index\.html)$">
    Redirect 301 / http://foo/
</FilesMatch>

此示例将提供本地index.html并将所有其他人员重定向到新域。


1

试试这个方法将所有重定向到首页新域,它对我有用:

RewriteCond %{HTTP_HOST} ^olddomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.olddomain\.com$
RewriteRule ^(.*)$ "https\:\/\/newdomain\.com\/" [R=301,L]

0

先前的答案对我不起作用。

我用了这段代码。如果使用OSX,请确保使用正确的格式。

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.