yakamara/redaxo_yrewrite

此软件包最新版本(2.10.0)没有提供许可信息。

2.10.0 2023-03-31 16:13 UTC

README

概述

REDAXO的YRewrite插件扩展了CMS的“可读”URL支持,并支持多个域名。没有Rewriter插件的REDAXO创建的URL遵循 index.php?article_id=13&clang=1 的模式。YRewrite提供可读的URL,例如 /de/news/archiv/,支持不同的模式。

以下情况可能需要多个域名:

  • 客户的多个网站在一个安装中管理时,
  • 一个网站的多种语言(clang)可以通过不同的域名或子域名访问,
  • 或者两者都满足。

提示:我们建议在第一种情况下,在每个域名的顶层结构中创建一个类别。

功能

  • 在一个网站中管理多个域名
  • 将域名依赖性分配给语言
  • 域名和语言相关的ROBOTS.txt指令和XML站点地图
  • 每个文章可以有独立的URL
  • 定义/每个域名/语言的自定义页面标题模式
  • 指向主域名的别名域名
  • 通用重定向。内部文章、文件、外部文章的URL,甚至协议转换,例如 tel:mailto: 等。
  • 规范URL

安装

YRewrite当前版本的先决条件:REDAXO >= 5.5

  • 通过REDAXO后端安装和激活
  • 执行设置

第一步

设置

在“设置”选项卡下,可以查看每个已配置域名的 sitemap.xmlrobots.txt。此外,还可以执行设置,通过 .htaccess 文件创建YRewrite的Apache配置。

YRewrite的Apache配置

执行设置以在主目录中创建所需的 .htaccess 文件。然后,所有前端URL都将重写为搜索引擎友好的URL。

注意 如果设置完成后前端URL无法正常工作,请检查是否是Apache或NGINX服务器(见下文)。另外,请检查Web托管套餐是否允许自定义 .htaccess 规则。

注意: 此插件将所有来自 /media/ 的请求通过媒体管理器插件重定向。因此,请确保没有名为“媒体”的结构类别,也没有文件(例如CSS或JS文件)位于其中。适合的目录是 /assets/ 或使用主题插件。如果需要使用名为“媒体”的类别,则必须在 .htaccess 文件中的相应行取消注释或重命名,并且在使用媒体管理器时使用这些行。这会产生其他影响,例如对YCom受保护的文件 - 因此,取消注释和重命名应由经验丰富的REDAXO开发者执行。

YRewrite的NGINX配置

完整的nginx配置用于YRewrite。

注意: 对于PLESK网站,可以将指令存储在域名的“Apache & nginx设置”部分下的“附加nginx指令”中。

charset utf-8;

location / {
  try_files $uri $uri/ /index.php$is_args$args;
}

rewrite ^/sitemap\.xml$                           /index.php?rex_yrewrite_func=sitemap last;
rewrite ^/robots\.txt$                            /index.php?rex_yrewrite_func=robots last;
rewrite ^/media[0-9]*/imagetypes/([^/]*)/([^/]*)  /index.php?rex_media_type=$1&rex_media_file=$2&$args;
rewrite ^/media/([^/]*)/([^/]*)                   /index.php?rex_media_type=$1&rex_media_file=$2&$args;
rewrite ^/media/(.*)                              /index.php?rex_media_type=yrewrite_default&rex_media_file=$1&$query_string;
rewrite ^/images/([^/]*)/([^/]*)                  /index.php?rex_media_type=$1&rex_media_file=$2&$args;
rewrite ^/imagetypes/([^/]*)/([^/]*)              /index.php?rex_media_type=$1&rex_media_file=$2;

# !!! WICHTIG !!! Falls Let's Encrypt fehlschlägt, diese Zeile auskommentieren (sollte jedoch funktionieren)
location ~ /\. { deny  all; }

// Zugriff auf diese Verzeichnisse verbieten
location ^~ /redaxo/src { deny  all; }
location ^~ /redaxo/data { deny  all; }
location ^~ /redaxo/cache { deny  all; }
location ^~ /redaxo/bin { deny  all; }


# In einigen Fällen könnte folgende Anweisung zusätlich sinnvoll sein.

location ~ /\.(ttf|eot|woff|woff2)$ {
  add_header Access-Control-Allow-Origin *;
  expires 604800s;
}

添加域名

  1. 在“YRewrite”的“域名”下点击+-符号。
  2. 输入域名,例如 https://www.meine-domain.de/
  3. 选择挂载点(可选)。这是YRewrite要链接的类别的起始文章。挂载文章下的所有文章都可以通过该域名访问。如果没有选择文章,则将所有级别分配给该域名(默认)。
  4. 选择起始页面文章。这可以是挂载文章或单独的文章页面。该页面将作为域的起始页面调用。
  5. 选择错误页面文章。这是以404错误代码输出的文章,例如,当找不到页面或地址存在错误时。
  6. 语言设置:在此可以选择与域关联的语言。例如,可以针对每种语言实现不同的域。
  7. 输入标题模式,例如 %T - 我的域名。然后在网站模板中可以输出此标题模式。
  8. 添加robots.txt设置。见下面的提示。
  9. 添加域名。

对于所有希望使用的域重复此操作。

提示:为了在开发过程中可靠地保护安装免受爬虫和搜索引擎的抓取,仅robots.txt是不够的。为此,有来自https://friendsofREDAXO.github.iomaintenance插件。

提示:将域名也添加到Google Search Console,并在那里添加sitemap.xml以加快抓取。应该以所有四种变体添加域名,即带/不带https和带/不带www.。但是,只在主域中添加sitemap.xml,最好使用https://www.

注意:请目前以解码方式输入带重音符号的域名。例如,使用https://www.punycoder.com进行转换。

注意:有关域名和多语言网站的最佳实践信息,请参阅管理多区域和多功能网站(来自Google Search Central文档)。

添加别名域名

当多个域名指向服务器上的同一文件夹但不会调用单独的网站时,需要别名域名。例如,www.meinedomain.dewww.meine-domain.de

如果域名不指向服务器文件夹,则不需要添加别名域名。一些托管服务提供商例如,默认提供从www.meinedomain.de重定向到www.meine-domain.de的功能。在这种情况下,不需要此设置。

  1. 在"YRewrite"下的"域名"中点击+-符号
  2. 添加别名域名,例如https://www.meine-domain.de/
  3. 从YRewrite中选择目标域名
  4. 添加别名域名

重定向

在重定向下可以定义URL,然后将其重定向到特定的文章或其他地址。

注意:使用此设置无法重定向已存在的文章/URL,只能重定向在REDAXO安装中不存在的URL。例如,在网站重新发布时,需要将旧URL重定向到新的目标页面。

提示:可以使用此设置将文章或分类重定向到完全不同的URI协议,例如tel:mailto:等。这些也会在其他地方得到考虑,例如在rex_navigation::factory()中。

其他步骤

可以在Google Search Console中为每个域名添加sitemap.xml,以检查域及其页面的正确索引。

类参考

YRewrite对象

另见:https://github.com/yakamara/redaxo_yrewrite/blob/main/lib/yrewrite/yrewrite.php

    $yrewrite = new rex_yrewrite;
    // dump($yrewrite); // optional alle Eigenschaften und Methoden anzeigen

方法

YRewrite域名对象

另见:https://github.com/yakamara/redaxo_yrewrite/blob/main/lib/yrewrite/domain.php

$domain = rex_yrewrite::getCurrentDomain();
dump($domain); // optional alle Eigenschaften und Methoden anzeigen

方法

init()
getScheme()
setScheme(rex_yrewrite_scheme $scheme)
addDomain(rex_yrewrite_domain $domain)
addAliasDomain($from_domain, $to_domain_id, $clang_start = 0)
getDomains()
getDomainByName($name)
getDomainById($id)
getDefaultDomain()
getCurrentDomain()
getFullUrlByArticleId($id, $clang = null, array $parameters = [], $separator = \'&\')
getDomainByArticleId($aid, $clang = null)
getArticleIdByUrl($domain, $url)
isDomainStartArticle($aid, $clang = null)
isDomainMountpoint($aid, $clang = null)
getPathsByDomain($domain)
prepare()
rewrite($params = [], $yparams = [], $fullpath = false)
generatePathFile($params)
checkUrl($url)
generateConfig()
readConfig()
readPathFile()
copyHtaccess()
isHttps()
deleteCache()
getFullPath($link = \'\')
getHost()

YRewrite SEO对象

另见:https://github.com/yakamara/redaxo_yrewrite/blob/main/lib/yrewrite/seo.php

$seo = new rex_yrewrite_seo();
dump($seo); // optional alle Eigenschaften und Methoden anzeigen

方法

示例

YRewrite中当前域的ID

rex_yrewrite::getCurrentDomain()->getId();

示例返回值:1

域的挂载ID

rex_yrewrite::getCurrentDomain()->getMountId();

示例返回值:5

域的起始文章ID

rex_yrewrite::getCurrentDomain()->getStartId();

示例返回值:42

域的错误文章ID

rex_yrewrite::getCurrentDomain()->getNotfoundId();

示例返回值:43

当前域的名称

rex_yrewrite::getCurrentDomain()->getName();

示例返回值:meine-domain.de

文章的完整URL

rex_yrewrite::getFullUrlByArticleId(42);

示例返回值:https://www.meine-domain.de/meine-kategorie/mein-artikel.html

当前文章属于哪个域名?

rex_yrewrite::getDomainByArticleId(REX_ARTICLE_ID)->getName();

示例返回值:meine-domain.de

读取元标签(descriptiontitleimage等)

将此代码段复制到模板的<head>区域

$seo = new rex_yrewrite_seo();
echo $seo->getTags();

这将生成以下输出

<meta name="description" content="Der Text aus dem Beschreibungs-Feld">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://example.org/de/">
<link rel="alternate" hreflang="de" href="https://example.org/de/">
<link rel="alternate" hreflang="en" href="https://example.org/en/">
<meta property="og:title" content="Artikelname / Websitetitel">
<meta property="og:description" content="Der Text aus dem Beschreibungs-Feld">
<meta property="og:image" content="https://example.org/media/yrewrite_seo_image/seo-image.jpg">
<meta property="og:image:alt" content="Der Bildtitel aus dem Medienpool">
<meta property="og:image:type" content="image/jpeg">
<meta property="og:url" content="https://example.org/de/">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Artikelname / Websitetitel">
<meta name="twitter:description" content="Der Text aus dem Beschreibungs-Feld">
<meta name="twitter:url" content="https://example.org/de/">
<meta name="twitter:image" content="https://example.org/media/yrewrite_seo_image/seo-image.jpg">';
<meta name="twitter:image:alt" content="Der Bildtitel aus dem Medienpool">

扩展/更改元标签

rex_extension::register('YREWRITE_SEO_TAGS', function(rex_extension_point $ep) {
    $tags = $ep->getSubject();
    
    // title-Tag ändern
    $title = rex_escape('Ein geänderter Titel');
    $tags['title'] = '<title>'.$title.'</title>';
    $tags['og:title'] = '<meta property="og:title" content="'.$title.'">';
    $tags['twitter:title'] = '<meta name="twitter:title" content="'.$title.'">';
    
    // favicon-Tags hinzufügen
    $tags['favicon'] = '
            <link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
            <link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon/favicon-32x32.png">
            <link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon/favicon-16x16.png">
            <link rel="manifest" href="/assets/favicon/site.webmanifest">
            <link rel="mask-icon" href="/assets/favicon/safari-pinned-tab.svg" color="#5bbad5">
            <link rel="shortcut icon" href="/assets/favicon/favicon.ico">
            <meta name="msapplication-TileColor" content="#ffffff">
            <meta name="msapplication-config" content="/assets/favicon/browserconfig.xml">
            <meta name="theme-color" content="#ffffff">';
    $ep->setSubject($tags);
});

根据选择的域名选择导航工厂

有关REDAXO核心中导航工厂的更多信息,请参阅API文档中的https://REDAXO.org/api/master/,以及FriendsOfREDAXO的技巧:https://github.com/friendsofREDAXO/tricks/

$nav = rex_navigation::factory();
echo $nav->get(rex_yrewrite::getCurrentDomain()->getMountId(), 1, TRUE, TRUE);

输出所有域的概览

$domains = array_filter(rex_sql::factory()->setDebug(0)->query(\'SELECT * FROM rex_yrewrite_domain\')
foreach($domains as $domain) {
    dump($domain);
}

YRewrite的URL方案

概述

YRewrite可以通过方案扩展。

安装

  • 将其作为项目插件目录下的lib文件夹中的文件保存。
  • 文件名:eigene_rewrite_class.php
  • 在项目插件的boot.php中使用
<?php
if (rex_addon::get(\'yrewrite\')->isAvailable()) {
    rex_yrewrite::setScheme(new eigene_rewrite_class());
}

以下是一些示例。

设置后缀为.html

<?php
class rex_yrewrite_scheme_mysuffix extends rex_yrewrite_scheme
{
    protected $suffix = \'.html\';
}

删除尾随斜杠

<?php
class rex_yrewrite_scheme_mysuffix extends rex_yrewrite_scheme
{
    protected $suffix = Null;
}

URL替换器

替换空父级类别的URL,使用下一个有内容的(在线)子类别的URL。

基于:https://gist.github.com/gharlan/a70704b1c309cb1281c1

无论父级类别的起始文章是否有内容,都进行重定向

<?php
class rex_yrewrite_scheme_gh extends rex_yrewrite_scheme
{
    protected $suffix = \'/\';

    public function getRedirection(rex_article $art, rex_yrewrite_domain $domain)
    {

        if ($art->isStartArticle() && ($cats = $art->getCategory()->getChildren(true))) {
            return $cats[0];
        }

        return false;
    }
}

只有当父级类别的起始文章没有内容时,才进行重定向

<?php
class rex_yrewrite_scheme_gh extends rex_yrewrite_scheme
{
    protected $suffix = \'/\';

    public function getRedirection(rex_article $art, rex_yrewrite_domain $domain)
    {

        if ($art->isStartArticle() && ($cats = $art->getCategory()->getChildren(true)) && !rex_article_slice::getFirstSliceForCtype(1, $art->getId(), rex_clang::getCurrentId())) {
            return $cats[0];
        }

    return false;
    }
}

使用Sprog插件进行URL操作

可以使用如{{contact}}这样的占位符作为分类名称,并通过Sprog中存储的语言变体进行替换。

单级,通过Sprog替换分类名称。

<?php
class translate_url_with_sprog extends rex_yrewrite_scheme
{

    public function appendCategory($path, rex_category $cat, rex_yrewrite_domain $domain)
    {
        return $path;
    }

    public function appendArticle($path, rex_article $art, rex_yrewrite_domain $domain)
    {
        return $path . \'/\' . $this->normalize(sprogdown($art->getName(), $art->getClangId()), $art->getClangId()) . \'/\';
    }
}

多级,通过Sprog替换分类名称。

<?php
class translate_url_with_sprog extends rex_yrewrite_scheme
{
    public function appendCategory($path, rex_category $cat, rex_yrewrite_domain $domain)
    {
        return $path . \'/\' . $this->normalize(sprogdown($cat->getName(), $cat->getClangId()), $cat->getClangId());
    }
}

使用自定义方案更改替换模式

替换模式可以使用自定义方案更改。在此示例中,将&替换为und

  1. 在项目插件的lib目录中创建文件
<?php

class rex_project_rewrite_scheme extends rex_yrewrite_scheme
{
    /**
     * @param string $string
     * @param int $clang
     *
     * @return string
     */
    public function normalize($string, $clang = 1)
    {
        $string = str_replace(
            ['&'],
            ['und'],
            $string
        );

        // Id 2 = ungarisch
        if ($clang == 2) {
            $string = str_replace(
                ['ő', 'ű'],
                ['oe', 'ue'],
                $string
            );
        }
        return parent::normalize($string, $clang);
    }
}
  1. 在项目插件的boot.php文件中插入此代码

rex_yrewrite::setScheme(new rex_project_rewrite_scheme());

带有自定义方案的插件

其他支持