【问题标题】:.htaccess redirect all pages to new domain.htaccess 将所有页面重定向到新域
【发布时间】:2010-12-29 01:40:05
【问题描述】:

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

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

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

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

但如果我导航到olddomain.example/somepage,我会被重定向到newdomain.example/somepage。我希望只重定向到 newdomain.example 而没有页面后缀。

如何保留最后一部分?

【问题讨论】:

  • 为了节省时间,请向下滚动到正确的最佳答案 RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L] * stackoverflow.com/a/7578810/1066234
  • 值得指出的是,特别是从 SEO 的角度来看,多对一重定向到索引/主页通常是一个坏主意。 Google 可能会将其视为软 404。
  • 如果您正在寻找htaccess tutorial,您可以在以下链接中找到它helponnet.com/2021/04/15/htaccess-tutorial-for-beginers

标签: .htaccess mod-rewrite


【解决方案1】:

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

在这里,这会将 URL 上域名之后的所有内容重定向到新域 URL 上的完全相同的副本:

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

【讨论】:

  • 这不会重定向每个请求,即使是 newdomain.com 的请求?在这些情况下,本质上会导致两个重复请求?
  • 问题是将所有内容重定向到主页
  • 虽然这不是问题的答案,但我从 SE 来到这个问题正是寻求这个答案。谢谢!!!
  • 如何从子域重定向到新域?
  • 有人可以回答比尔的问题吗?这不应该使用 RewriteCond 来防止重复请求和/或不必要的重写吗?我想即使没有必要,每次都重新编写也不会产生任何明显的影响。但为什么要这样做。
【解决方案2】:

可能是这样的:

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

【讨论】:

  • 嗯,您可以尝试重新加载您的浏览器吗?它甚至在这里用 xampp 重定向。我刚刚测试过。
  • 我的错......它确实有效,我的托管服务有一些其他重定向,这太糟糕了。谢谢! :)
  • 不会是RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]吗?
  • 经过一个漫长的冬天,我编辑了代码,让它终于可以工作了。 (正确的是重定向如果 EQUAL 而不是 DIFFERENT 到 olddomain,那就是问题)
  • @JimGeurts 仅当您想重定向所有不是新域的东西时。但是,在这种情况下,我们只想重定向 olddomain。
【解决方案3】:

澄清一下,在移除了阻碍的托管重定向后,我原来的解决方案也有效:

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

【讨论】:

  • 这将重定向到默认索引,这就是您的问题所在。只是为了清楚起见,因为由于接近,您的陈述似乎是针对 user968421 的答案,就在此之上,当意图重定向到新域上的相应文件名时,user968421 的答案是正确的。
【解决方案4】:

我在我的 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>

【讨论】:

  • 我认为这是最全面的答案:它保留了每个页面的排名,并且是所有非主要域的统称!还有什么更好的?
  • 这里的关键是域重写规则出现在WordPress索引重写规则之前。
【解决方案5】:
<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>

这对我有用

【讨论】:

  • 是的,这种方法既干净又好用!对我也有效。
  • 这将使用 URl 中的参数重定向(如果有) - index.php?aa=9 会将参数携带到新域
  • 非常感谢。
  • 最安全的解决方案。尤其是当两个域都由同一个 .htaccess 控制时。
  • 在我看来,这个答案应该是选择的答案,因为它涵盖了最常见的重定向案例。我唯一要补充的是,如果您还需要不区分大小写,可以将 [OR] 更改为 [NC,OR]。请参阅RewriteRule Flags 了解更多信息。
【解决方案6】:

有多种方法可以做到这一点和各种重定向,我在下面列出了它们:

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,那么原站点的所有页面都会被重定向到新站点的根目录
  • @YassinMK $1 在这里不是必需的,您正在考虑 RedirectMatch 指令(但您仍然需要为 $1 定义一个捕获组以供参考)。
  • 尽管所有这些Redirect 指令都会像for like 一样重定向,而OP 只想重定向到新站点的主页(尽管不建议这样做)。如果您只想重定向到特定的 URL,您可能需要使用 RedirectMatch 指令。
  • 你也可以写Redirect Permanent / h ttps://www.example.com代替301,你可以在vhost文件中这样做
  • 但是与 .htaccess 相关的问题为什么要提到 vhost 文件呢?
【解决方案7】:

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

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

【讨论】:

  • 这是最好的方法。因为很多 Webhosters 不允许在 .htaccess 中使用 RewriteEngine。无论如何,这很好用!
  • 必须使用 RewriteEngine 进行重定向。您遇到问题的原因是 RewriteEngine 已经处于活动状态,您只需要重定向规则。我很高兴这有帮助。
  • 不正确。它会跳过所有 Rewrite 事情,并且在使用 RewriteEngine On 时会抛出 500 Internal Error。这是一个非常受限的网络空间。使用Redirect 301 / http://foo是唯一可能的处理方式。
  • 这将导致重定向格式错误,因为您在目标 URL 上缺少尾部斜杠。使用Redirect 指令,您需要在both 源和目标URL 上包含或省略尾部斜杠。
【解决方案8】:

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

Redirect 301 / http://newdomain.com

这会将来自olddomain的所有请求重定向到newdomain

Redirect 指令将不起作用或可能导致 Redirect loop 如果您的新域和旧域都在同一主机上,在这种情况下,您需要使用 mod-rewrite 根据请求的主机标头进行重定向。

RewriteEngine on


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

【讨论】:

    【解决方案9】:

    就像这样简单,它不会将尾随查询从 URL 带到新域。

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

    【讨论】:

    • 实际上对我有用,需要一个解决方案,而不会将任何 slug 传递给新域谢谢 Dsynmphony
    【解决方案10】:

    我的声誉不允许我对答案发表评论,但我只想指出,这里评分最高的答案有错误:

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

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

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

    【讨论】:

    • “评分最高的答案”实际上是在此答案发布一个月后更正
    【解决方案11】:

    我作为 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();
    }
    

    【讨论】:

      【解决方案12】:

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

      我们的主机(Site Ground)也想不通。

      最终的解决方案很接近,但对 user968421 的回答稍作调整(旁注:与 OP 不同,我试图重定向到相应的页面,而不仅仅是主页,所以我保留了反向引用 [$1在域之后]来自user968421的回答):

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

      Host Gator article 推荐的htaccess redirect generator 中获得了调整(绝望的时代,绝望的措施,对吗?)。

      【讨论】:

        【解决方案13】:

        这是旧版本的 apache(以及 mod_rewrite)中的一个错误,如果路径前缀被更改,它会被附加到重写的路径中。 See here

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

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

        【讨论】:

        • 我为此努力了将近一个月
        • 您可能指的标志是DPI(丢弃路径信息)。但是,这在问题的背景下应该是无关紧要的。这仅适用于您有其他包含路径信息的内部重写。但是,此标志应应用于重写,而不是最终重定向。
        【解决方案14】:

        从可用性的角度来看,如果您还发送带有请求的路径(即,您目前拥有的)并让您的新网站处理它会更好:

        您搜索过“/products”。

        很遗憾,此页面已消失。您想改为访问“/new_products”吗?

        (更好的是,自动执行此操作。)

        对于一个更大的网站来说,这显然需要大量的编码和启发式方法,但在我看来,它会在用户满意度方面得到回报(当您精心保存的梦想产品的书签只会将您带到 newdomain 的首页时)。 com,这令人沮丧。)

        【讨论】:

        • 对于所说的网站,这几乎无关紧要,因为整个网站都发生了变化,但你是绝对正确的。该网站应尽可能向后兼容。 +1
        【解决方案15】:

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

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

        【讨论】:

          【解决方案16】:

          如果还应提供一些本地文件,请使用由主机禁用的 Options -FollowSymLinksAllowOverride -Options 条件重定向:

          .htaccess 示例

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

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

          【讨论】:

            【解决方案17】:

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

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

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

            【讨论】:

              【解决方案18】:

              最简单的方法其实就是:

              Redirect 301 / http://www.newsite.com/

              来源:https://github.com/phanan/htaccess#redirect-an-entire-site

              【讨论】:

                【解决方案19】:

                这可能是正常工作

                <IfModule mod_rewrite.c>
                RewriteEngine on
                RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
                </IfModule>
                

                【讨论】:

                  猜你喜欢
                  • 2011-09-24
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-02-28
                  • 2012-01-15
                  • 1970-01-01
                  • 2017-03-08
                  • 2013-02-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多