【问题标题】:Mod Rewrite to remove language from url in Concrete5 cmsMod重写以从Concrete5 cms中的url中删除语言
【发布时间】:2015-06-30 16:57:49
【问题描述】:

我完全被难住了。希望你能帮忙。我刚刚花了一个月的时间在 Concrete5 版本 7.3.1 中重新开发我们的网站,最新版本,我已经准备好启动了。这是一个多语言网站,我们的 SEO 人员建议不要在默认语言(英语)的 URL 中包含该语言,因为这会将我们的主页从 domain.com/ 更改为 domain.com/en/,以及我们的旧网站默认设置语言在基本目录中。

Concrete5 不支持这一点,所以基本上我希望通过一些 .htaccess 技巧来实现这一点,但我无处可去。

具体的 5 个 url 是 domain.com/index.php/en/path/to/page,所以所有页面都来自 index.php。有一个重写规则如下,可以对用户隐藏 index.php 并使 url 漂亮。

#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME}/index.html !-f
#RewriteCond %{REQUEST_FILENAME}/index.php !-f
#RewriteRule . index.php 

我想进一步添加一种方法,从不包含它的 url 为服务器端添加 /en/。即

RewriteRule ^/index.php/(.*) ^/index.php/en/$1 [L]

然后我可以从 url 中删除 en 并且系统仍然可以工作。

我已经尝试在具体的重写之前(没有 index.php)、之后和多种不同的组合,但不断收到 401 错误并且很难诊断问题,因为查看生成的 url 并不容易。

任何帮助都将不胜感激,因为我必须在发布前弄清楚这一点。

【问题讨论】:

  • 这不是你可以在没有大量工作和非常喜怒无常的.htaccess 的情况下完成的事情,事实上,将您的网站设置为/en 并没有任何 SEO 问题实际上可能会提高您的排名。也就是说,您使用的是什么版本的 concrete5?
  • 如果您希望 /en 成为唯一在域根目录下解析的路径,具体取决于站点的大小,您始终可以向在路径中解析的页面添加其他路径,而无需/en。我意识到这可能不是一个实用的解决方案,但它可以解决问题:) 编辑:也就是说,在页面属性中添加通过 CMS 的路径。
  • 嗨,Korvin,是的,同意,将根放在 /en 没有 SEO 问题,但是从一个曾经在 / 有根的站点移动,然后将其更改为 /en .我可以进行 301 重定向,但仍然会失去一些“链接汁”,正如我的 SEO 人员所说的那样。我正在使用 Concrete5 5.7.3.1。
  • coupdecoop,谢谢你,但我还没有找到让 Concrete5 解决根路径的方法。 IE。具体5 有一个根主页,它重定向到/en/,它有我真正的主页。如果我在 / 处添加解析路径,我要么会显示虚拟主页,而不是我的真实主页,要么会陷入重定向循环。
  • @a575606 我相信@coupdecoup 正在谈论更多关于/en/example 之类的子页面,我可以让我在/example 显示,但我仍然不确定301 重定向会损害您的页面排名大大地。网站不断移动,谷歌并不愚蠢。例如,我不知道有任何方法可以在没有痛苦和代码的情况下实现这一目标; /de 是要解析到德国主页,还是 /en/de

标签: .htaccess mod-rewrite url-rewriting seo concrete5


【解决方案1】:

this recently added event 在即将推出的新 5.7.4 版本中,我们能够对请求做一些有趣的事情。我们可以做的一件事是确保该路径上的页面不存在,然后重写请求以使其看起来具体5 请求实际上是进入/en

\Events::addListener('on_before_dispatch', function() {
    $request = \Request::getInstance();
    $page = \Page::getByPath($request->getPath()); // Get the real requested page

    if ($page->isError()) { // If it doesn't exist
        $path = new \Concrete\Core\Url\Components\Path($request->getPath());
        $path = $path->prepend('en'); // prepend "/en" to the path, ex: "/path/to" becomes "/en/path/to"

        $page = Page::getByPath($path);
        if (!$page->isError) { // Make sure that this page actually exists
            // This may not work, you might need to replace the actual \Request instance.
            $request->setCurrentPage($page); // Set it to the requested page. 
        }
    }
});

我真的建议你不要这样做。正如我的 cmets 关于这个问题的描述,您会遇到非常奇怪的情况,这些情况会导致您的网站出现 SEO 问题和一般路由问题。


编辑:concrete5 版本 8 包含 HTTP 中间件,这是解决此问题的更好方法。

【讨论】:

  • 看起来正是我所需要的。什么地方放这个好?配置文件之一还是有更好的地方?
  • 放置这个的最佳位置是/application/bootstrap/app.php
  • 太棒了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2011-04-11
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多