yakamara / redaxo_yrewrite
Requires
- php: >=8.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.15.1
- friendsofredaxo/linter: ^1.4
- j13k/yaml-lint: @dev
- redaxo/php-cs-fixer-config: ^2.1.1
- redaxo/psalm-plugin: ^2.0
- redaxo/source: ^5.15.1
- vimeo/psalm: ^5.9.0
- yakamara/redaxo_yform: dev-master
This package is auto-updated.
Last update: 2024-09-06 13:18:51 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.xml
和 robots.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; }
添加域名
- 在“YRewrite”的“域名”下点击+-符号。
- 输入域名,例如
https://www.meine-domain.de/
。 - 选择挂载点(可选)。这是YRewrite要链接的类别的起始文章。挂载文章下的所有文章都可以通过该域名访问。如果没有选择文章,则将所有级别分配给该域名(默认)。
- 选择起始页面文章。这可以是挂载文章或单独的文章页面。该页面将作为域的起始页面调用。
- 选择错误页面文章。这是以404错误代码输出的文章,例如,当找不到页面或地址存在错误时。
- 语言设置:在此可以选择与域关联的语言。例如,可以针对每种语言实现不同的域。
- 输入标题模式,例如
%T - 我的域名
。然后在网站模板中可以输出此标题模式。 - 添加robots.txt设置。见下面的提示。
- 添加域名。
对于所有希望使用的域重复此操作。
提示:为了在开发过程中可靠地保护安装免受爬虫和搜索引擎的抓取,仅robots.txt是不够的。为此,有来自https://friendsofREDAXO.github.io的
maintenance
插件。
提示:将域名也添加到Google Search Console,并在那里添加
sitemap.xml
以加快抓取。应该以所有四种变体添加域名,即带/不带https
和带/不带www.
。但是,只在主域中添加sitemap.xml
,最好使用https://
和www.
注意:请目前以解码方式输入带重音符号的域名。例如,使用https://www.punycoder.com进行转换。
注意:有关域名和多语言网站的最佳实践信息,请参阅管理多区域和多功能网站(来自Google Search Central文档)。
添加别名域名
当多个域名指向服务器上的同一文件夹但不会调用单独的网站时,需要别名域名。例如,www.meinedomain.de
和www.meine-domain.de
。
如果域名不指向服务器文件夹,则不需要添加别名域名。一些托管服务提供商例如,默认提供从www.meinedomain.de
重定向到www.meine-domain.de
的功能。在这种情况下,不需要此设置。
- 在"YRewrite"下的"域名"中点击+-符号
- 添加别名域名,例如
https://www.meine-domain.de/
- 从YRewrite中选择目标域名
- 添加别名域名
重定向
在重定向下可以定义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
读取元标签(description
、title
、image
等)
将此代码段复制到模板的<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。
无论父级类别的起始文章是否有内容,都进行重定向
<?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
。
- 在项目插件的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);
}
}
- 在项目插件的
boot.php
文件中插入此代码
rex_yrewrite::setScheme(new rex_project_rewrite_scheme());
带有自定义方案的插件
其他支持
- 通过GitHub报告错误:https://github.com/yakamara/redaxo_yrewrite/issues/
- 通过REDAXO Slack频道获取帮助:https://friendsofREDAXO.slack.com/
- 通过FriendsOfREDAXO获取技巧:https://friendsofredaxo.github.io/tricks/ 在插件 > YRewrite 下