【问题标题】:Advanced 301 redirect for an entire site at site root?站点根目录下整个站点的高级 301 重定向?
【发布时间】:2014-12-16 22:31:19
【问题描述】:

我正在努力解决一个古老的问题。我继承了一个网站,它有一些非常好的 SEO 和一个明显的问题。整个站点托管在 /site/ 子目录中。我决定我需要在根目录加载站点。所以像http://example.org/site/index.php 这样的东西将改为重定向到/index.php(

我们使用 joomla 作为后端,此时网站上有数百个页面。我一直在努力获得我所看到的任何重定向来做我想让他们做的事情。基本上,我们的顾客从带有 /site/ 的旧链接访问的任何页面都应该重定向到完全相同的链接,但没有星号。

我愿意从 /site/ 加载页面并使其看起来像是来自根目录。据我了解,这可以通过一些改进 mod-rewrite (http://kb.mediatemple.net/questions/85/Using+.htaccess+rewrite+rules#gs ?) 来完成,但我还没有取得任何成功。我运行了一个测试版站点,它模仿了我已经从 /site/ 移动到 / 的子域中的父站点,因此我可以测试很多 .htaccess 配置。

任何帮助表示赞赏...谢谢!

【问题讨论】:

  • 我发现这似乎可以解决问题... RewriteCond %{http_host} !^www.beta.example.org$ [nc] RewriteRule ^(.*)$ beta.example.org/$1 [r =301,nc,L] 有谁知道此代码是否可以与启用的 joomla url 重写一起使用?所以它也可以从页面中删除 /index.php/ 吗?另外,我不确定这段代码是如何工作的,但它似乎完全符合我的需要。

标签: .htaccess mod-rewrite redirect joomla


【解决方案1】:

只是为了确定:您希望http://example.org/site/foo/bar/baz.php 转到http://example.org/foo/bar/baz.php,也就是说,如果 /site 前缀存在,则删除(通过重定向),但不要触摸 URL,对吧?如果是这样,这取决于您使用的是哪个服务器:

  • 如果您的服务器是 Apache,您可以在 .htaccess 中使用类似这样的内容:

    RedirectMatch 301 ^/site/(.*)$ http://example.com/$1    
    
  • 如果是 nginx,请将其添加到您网站文件的 server {...} 会话中(通常在 /etc/nginx/sites-enabled 内符号链接):

    location ~ ^/site/(.*)$ { rewrite ^/site/(.*)$ /$1 permanent; }
    

Here is a good explanation 了解如何在两个服务器中设置这种基于模式的重定向。

【讨论】:

  • 这很棒..简单..优雅。我不知道为什么在谷歌上搜索时找不到链接。 .htaccess 中的那一行绝对完美!您是否建议在其中添加任何其他内容以提高其有效性?我想知道重定向后会弹出一个弹出窗口,上面写着“请为新页面添加书签”或其他内容。有任何想法吗?无论如何,谢谢!
  • 很高兴它很有用。不幸的是,重定向标头将被立即处理,因此它无法真正呈现任何内容。另一方面,两个配置都使用301 HTTP 状态,它“告诉”搜索引擎(和智能书签机制)重定向是“永久的”,因此它们将在记录中用新 URL 替换旧 URL。 SEO 方面,这是最好的方法。
【解决方案2】:

如果你的服务器是apache2,你可以在那里配置

<VirtualHost *:80>
ServerName sitio.com
ServerAlias www.sitio.com
DocumentRoot /home/user/public_html/sitio/
...
</VirtualHost>

您需要此更改的权限

【讨论】:

    【解决方案3】:

    这似乎是我将采用的有效答案。基本上,这需要放入您想要重定向的目录中,在我的情况下,它是 root/site/。


    重写引擎开启

    RewriteCond %{http_host} !^www.beta.example.org$ [nc]

    重写规则 ^(.*)$ http://beta.example.org/$1 [r=301,nc,L]


    我假设第一条规则忽略了 www?我很想解决这个问题,但不确定究竟为什么会创建它。这将重写访问该 .htaccess 文件(在您的子目录中)的任何 URL,并将您定向到没有子目录列表的相同 URL。它并不能真正与 index.php 重写工具一起使用,但这很好,因为它仍然可以到达正确的页面。

    如果有人对我使用 Joomla 有更好的选择,我会很高兴听到。但是,我认为这就是我现在要做的,因为它给了我很好的结果。

    【讨论】:

    • 第一个不忽略www; RewriteCond says “嘿,如果匹配,你需要做一些事情”。当然,“something”是 RewriteRule。根据您的问题,您的答案似乎相当不正确。如果您不接受,我会给出更好的规则。
    • This answer 似乎更适合您的问题。您的答案中的规则有效地表示:If the domain doesn't start with 'www', redirect to a version without 'www'. 这通常会导致重定向循环,但是通过重定向到不受此规则影响的位置可以避免这种情况。您可以删除 RewriteCond 行并在规则中使用路径而不是完整 URL,以使规则的意图更清晰。
    • 感谢您解释这一点。我不接受我的并接受了下面这些人的回答,因为他做得非常出色。有没有更好的办法?如果有人改进下面的@chesterbr,我很乐意更改最佳答案。我认为他的回答也适用于现有的 SEO。我接受我找到的答案只是因为它看起来正在做我想做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2018-01-30
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多