{"id":28565771,"url":"https://github.com/yakamara/yrewrite","last_synced_at":"2025-06-10T14:40:19.101Z","repository":{"id":5838600,"uuid":"7054540","full_name":"yakamara/yrewrite","owner":"yakamara","description":"A multidomain URL rewrite engine for REDAXO","archived":false,"fork":false,"pushed_at":"2025-04-01T02:08:07.000Z","size":682,"stargazers_count":56,"open_issues_count":39,"forks_count":35,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-04-27T10:44:35.002Z","etag":null,"topics":["hacktoberfest","php","redaxo","rewrite-urls"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yakamara.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2012-12-07T14:38:54.000Z","updated_at":"2025-03-25T10:33:33.000Z","dependencies_parsed_at":"2024-05-06T14:22:39.125Z","dependency_job_id":"6d9ba76e-02f9-4023-81d8-5bfc4d264165","html_url":"https://github.com/yakamara/yrewrite","commit_stats":{"total_commits":423,"total_committers":36,"mean_commits":11.75,"dds":0.6052009456264775,"last_synced_commit":"99458f801963b5578c35de6ab6120a8d7dfbaf14"},"previous_names":["yakamara/yrewrite","yakamara/redaxo_yrewrite"],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yakamara%2Fyrewrite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yakamara%2Fyrewrite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yakamara%2Fyrewrite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yakamara%2Fyrewrite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yakamara","download_url":"https://codeload.github.com/yakamara/yrewrite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yakamara%2Fyrewrite/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259093957,"owners_count":22804262,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest","php","redaxo","rewrite-urls"],"created_at":"2025-06-10T14:40:17.441Z","updated_at":"2025-06-10T14:40:19.065Z","avatar_url":"https://github.com/yakamara.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# YRewrite\n\n## Übersicht\n\nDas AddOn YRewrite für REDAXO erweitert das CMS um \"sprechende\" URLs und unterstützt den Betrieb mehrerer Domains.\nREDAXO ohne Rewriter-AddOn erstellt Urls nach dem Schema `index.php?article_id=13\u0026clang=1`zur Vefügung. YRewrite  bietet lesbare URLs wie z.B. `/de/news/archiv/` in verschiedenen Schemata.\n\nMehrere Domains können dann sinnvoll sein, wenn\n\n* mehrere Websites eines Kunden in einer Installation verwaltet werden,\n* verschiedene Sprachen (`clang`) einer Website unter unterschiedlichen Domains oder Subdomains erreichbar sind,\n* oder beides.\n\n\u003e Tipp: Wir empfehlen im ersten Fall, für jede einzelne Domain in der Struktur auf der obersten Ebene eine Kategorie anzulegen.\n\n## Features\n\n* Mehrere Domains in einer Webseite verwaltbar\n* Sprachabhängigkeiten von Domains zuweisbar\n* Domain- und sprachabhängige ROBOTS.txt-Anweisungen und XML-Sitemaps\n* Individuelle URL pro Artikel möglich\n* Seitentitel-Schema definierbar / pro Domain/Sprache\n* Alias Domains die auf die Hauptdomain verweisen\n* Allgemeine Weiterleitungen. URLs zu internen Artikeln, Dateien, externen Artikeln, sogar Protokoll-Tausch in bspw. `tel:`, `mailto:` u.a.\n* Canonical Urls\n\n## Installation\n\nVoraussetzung für die aktuelle Version von YRewrite: REDAXO \u003e= 5.5\n\n* Über das REDAXO-Backend installieren und aktivieren\n* Setup ausführen\n\n# Erste Schritte\n\n## Setup\n\nUnter dem Reiter `Setup` sind die `sitemap.xml` und `robots.txt` je eingerichteter Domain einsehbar. Außerdem lässt sich ein Setup durchführen, bei der die Apache-Konfiguration für YRewrite über eine `.htaccess`-Datei erstellt wird.\n\n### Apache-Konfiguration für YRewrite\n\nDas Setup ausführen, um eine `.htaccess`-Datei im Hauptverzeichnis zu erstellen, die für die Verwendung von YRewrite benötigt wird. Anschließend werden alle Frontend-URLs in suchmaschinenfreundliche URLs umgeschrieben (\"Rewriteing\").\n\n\u003e **Hinweis** Sollten nach Abeschluss des Setups die Frontend-URLs nicht funktionieren, bitte prüfen, ob es sich um einen Apache- oder NGINX-Server handelt (siehe unten). Außerdem prüfen, ob das Webhosting-Paket eigene `.htaccess`-Regeln erlaubt.\n\n\u003e **Hinweis:** Das Addon leitet alle Anfragen von `/media/` über das Media-Manager-AddOn. Stelle daher sicher, dass es weder eine Struktur-Kategorie \"Media\" gibt, noch, dass sich keine deiner Dateien fürs Frontend, bspw. CSS- oder JS-Dateien, darin befinden. Gute Orte hierfür sind die Ordner `/assets/` oder die Verwendung des Theme-AddOns. Sollte es notwendig sein, eine Kategorie namens \"Media\" zu verwenden, dann müssen [die entsprechenden Zeilen in der .htaccess-Datei](https://github.com/yakamara/redaxo_yrewrite/blob/b519622a3be135f1380e35bf85783cc33e71664f/setup/.htaccess#L96-L97) auskommentiert oder umbenannt werden und diese fortan genutzt werden, wenn Medien aus dem Medien Manager verwendet werden. Dies hat weitere Auswirkungen, z.B. auf geschützte Dateien mit YCom - das Auskommentieren und Umbenennen sollte daher nur von erfahrenen REDAXO-Entwicklern vorgenommen werden.\n\n### NGINX-Konfiguration für YRewrite\n\nEine vollständige nginx config für YRewrite.\n\n\u003e Hinweis für PLESK-Websites: Die Direktiven können unter ***Einstellungen für Apache \u0026 nginx*** der gewünschten Domain im Abschnitt ***Zusätzliche nginx-Anweisungen*** hinterlegt werden.\n\n```nginx\ncharset utf-8;\n\nlocation / {\n  try_files $uri $uri/ /index.php$is_args$args;\n}\n\nrewrite ^/sitemap\\.xml$                           /index.php?rex_yrewrite_func=sitemap last;\nrewrite ^/robots\\.txt$                            /index.php?rex_yrewrite_func=robots last;\nrewrite ^/media[0-9]*/imagetypes/([^/]*)/([^/]*)  /index.php?rex_media_type=$1\u0026rex_media_file=$2\u0026$args;\nrewrite ^/media/([^/]*)/([^/]*)                   /index.php?rex_media_type=$1\u0026rex_media_file=$2\u0026$args;\nrewrite ^/media/(.*)                              /index.php?rex_media_type=yrewrite_default\u0026rex_media_file=$1\u0026$query_string;\nrewrite ^/images/([^/]*)/([^/]*)                  /index.php?rex_media_type=$1\u0026rex_media_file=$2\u0026$args;\nrewrite ^/imagetypes/([^/]*)/([^/]*)              /index.php?rex_media_type=$1\u0026rex_media_file=$2;\n\n// !!! WICHTIG !!! Falls Let's Encrypt fehlschlägt, diese Zeile auskommentieren (sollte jedoch funktionieren)\nlocation ~ /\\. { deny  all; }\n\n// Zugriff auf diese Verzeichnisse verbieten\nlocation ^~ /redaxo/src { deny  all; }\nlocation ^~ /redaxo/data { deny  all; }\nlocation ^~ /redaxo/cache { deny  all; }\nlocation ^~ /redaxo/bin { deny  all; }\n\n\n// In einigen Fällen könnte folgende Anweisung zusätlich sinnvoll sein.\n\nlocation ~ /\\.(ttf|eot|woff|woff2)$ {\n  add_header Access-Control-Allow-Origin *;\n  expires 604800s;\n}\n```\n\n\n## Domain hinzufügen\n\n1. In \"YRewrite\" unter \"Domains\" Auf das +-Zeichen klicken.\n2. Domain eintragen, bspw. `https://www.meine-domain.de/`.\n3. Mountpoint auswählen (optional). Das ist der Startartikel einer Kategorie, in der sich YRewrite einklinken soll. Alle Artikel unterhalb des Mount-Artikels sind dann über die Domain aufrufbar. Wird kein Artikel ausgewählt, sind alle Ebenen dieser Domain zugeordnet (Standard).\n4. Startseiten-Artikel auswählen. Das kann der Mount-Artikel sein oder eine separate Artikelseite. Diese wird als Startseite der Domain aufgerufen.\n5. Fehlerseiten-Artikel auswählen. Das ist der Artikel, der mit einem 404-Fehlercode ausgegeben wird, z.B., wenn eine Seite nicht gefunden werden kann oder ein Tippfehler in der Adresse vorliegt.\n6. Spracheinstellungen: Hier können Sprachen ausgewählt werden, die mit der Domain verknüpft werden. So lassen sich bspw. unterschiedliche Domains pro Sprache umsetzen.\n7. Titelschema eintragen, bspw. `%T - Meine Domain`. Dieses Titelschema kann dann im Website-Template ausgegeben werden.\n8. robots.txt-Einstellungen hinzufügen. Siehe Tipp unten.\n9. Domain hinzufügen.\n\nDiese Vorgehensweise für alle gewünschten Domains wiederholen.\n\n\u003e **Tipp:** Um die Installation während der Entwicklung zuverlässig gegen ein Crawling von Bots und Suchmaschinen zu schützen, genügt die `robots.txt` nicht. Dazu gibt es das `maintanance`-Addon von https://friendsofREDAXO.github.io\n\n\u003e **Tipp:** Die Domain auch in der Google Search Console hinterlegen und die `sitemap.xml` dort hinzufügen, um das Crawling zu beschleunigen. Die Domain sollte in allen vier Variationen hinterlegt werden, also mit/ohne `https` und mit/ohne `www.`. Die `sitemap.xml` jedoch nur in der Hauptdomain, am besten mit `https://` und `www.`\n\n\u003e **Hinweis:** Domains mit Umlauten bitte derzeit decodiert eintragen. Umwandlung bspw. mit https://www.punycoder.com\n\n\u003e **Hinweis:** Informationen zu Best Practice zu Domains und mehrsprachigen Websites auch unter [Multiregionale und mehrsprachige Websites verwalten](https://developers.google.com/search/docs/advanced/crawling/managing-multi-regional-sites?hl=de) aus der Google Search Central Dokumentation.\n\n## Alias-Domain hinzufügen\n\nAlias-Domains werden nur dann benötigt, wenn mehrere Domains auf den selben Ordner im Server zeigen, aber keine separaten Websites aufrufen. z.B. `www.meinedomain.de` und `www.meine-domain.de`.\n\nAlias-Domains müssen nicht eingetragen werden, wenn die Domain nicht auf das Serververzeichnis zeigt. Einige Hoster bieten bspw. von sich aus die Möglichkeit, per Redirect von `www.meinedomain.de` auf `www.meine-domain.de` weiterzuleiten. Dann wird die Einstellung nicht benötigt.\n\n1. In \"YRewrite\" unter \"Domains\" Auf das +-Zeichen klicken\n2. Alias-Domain eintragen, bspw. `https://www.meine-domain.de/`\n3. Ziel-Domain aus YRewrite auswählen\n4. Alias-Domain hinzufügen\n\n## Weiterleitungen\n\nUnter Weiterleitungen können URLs definiert werden, die dann auf einen bestimmten Artikel oder eine andere Adresse umgeleitet werden.\n\n\u003e **Hinweis:** Mit dieser Einstellung können nicht bereits vorhandene Artikel / URLs umgeleitet werden, sondern nur URLs, die in der REDAXO-Installation nicht vorhanden sind. Das ist bspw. bei einem Relaunch der Fall, wenn alte URLs auf eine neue Zielseite umgeleitet werden sollen.\n\n\u003e **Tipp**: Damit lässt sich auch ein Artikel oder eine Kategorie zu einem gänzlich anderen URI-Protokoll ändern, bspw. `tel:`, `mailto:` u.a. Diese werden auch an anderer Stelle, bspw. von der `rex_navigation::factory()`, berücksichtigt.\n\n## Weitere Schritte\n\nDie `sitemap.xml` kann pro Domain bspw. in der Google Search Console eingetragen werden, um die korrekte Indexierung der Domain(s) und deren Seiten zu überprüfen.\n\n# Klassen-Referenz\n\n## YRewrite-Objekt\n\nSiehe auch: https://github.com/yakamara/redaxo_yrewrite/blob/main/lib/yrewrite/yrewrite.php\n\n```\n    $yrewrite = new rex_yrewrite;\n    // dump($yrewrite); // optional alle Eigenschaften und Methoden anzeigen\n```\n\n**Methoden**\n\n```\n```\n\n## YRewrite-Domain-Objekt\n\nSiehe auch: https://github.com/yakamara/redaxo_yrewrite/blob/main/lib/yrewrite/domain.php\n\n```\n$domain = rex_yrewrite::getCurrentDomain();\ndump($domain); // optional alle Eigenschaften und Methoden anzeigen\n```\n\n**Methoden**\n```\ninit()\ngetScheme()\nsetScheme(rex_yrewrite_scheme $scheme)\naddDomain(rex_yrewrite_domain $domain)\naddAliasDomain($from_domain, $to_domain_id, $clang_start = 0)\ngetDomains()\ngetDomainByName($name)\ngetDomainById($id)\ngetDefaultDomain()\ngetCurrentDomain()\ngetFullUrlByArticleId($id, $clang = null, array $parameters = [], $separator = \\'\u0026amp;\\')\ngetDomainByArticleId($aid, $clang = null)\ngetArticleIdByUrl($domain, $url)\nisDomainStartArticle($aid, $clang = null)\nisDomainMountpoint($aid, $clang = null)\ngetPathsByDomain($domain)\nprepare()\nrewrite($params = [], $yparams = [], $fullpath = false)\ngeneratePathFile($params)\ncheckUrl($url)\ngenerateConfig()\nreadConfig()\nreadPathFile()\ncopyHtaccess()\nisHttps()\ndeleteCache()\ngetFullPath($link = \\'\\')\ngetHost()\n```\n## YRewrite-SEO-Objekt\n\nSiehe auch: https://github.com/yakamara/redaxo_yrewrite/blob/main/lib/yrewrite/seo.php\n\n\n```\n$seo = new rex_yrewrite_seo();\ndump($seo); // optional alle Eigenschaften und Methoden anzeigen\n```\n\n**Methoden**\n\n```\n```\n\n# Beispiele\n\n## ID der aktuellen Domain in YRewrite\n\n```\nrex_yrewrite::getCurrentDomain()-\u003egetId();\n\n```\n\nBeispiel-Rückgabewert: `1`\n\n## Mount-ID der Domain\n\n```\nrex_yrewrite::getCurrentDomain()-\u003egetMountId();\n```\n\nBeispiel-Rückgabewert: `5`\n\n\n## Startartikel-ID der Domain\n\n```\nrex_yrewrite::getCurrentDomain()-\u003egetStartId();\n```\n\nBeispiel-Rückgabewert: `42`\n\n## Fehler-Artikel-ID der Domain\n\n```\nrex_yrewrite::getCurrentDomain()-\u003egetNotfoundId();\n```\n\nBeispiel-Rückgabewert: `43`\n\n## Name der aktuellen Domain\n\n```\nrex_yrewrite::getCurrentDomain()-\u003egetName();\n```\n\nBeispiel-Rückgabewert: `meine-domain.de`\n\n## vollständige URL eines Artikels\n\n```\nrex_yrewrite::getFullUrlByArticleId(42);\n```\n\nBeispiel-Rückgabewert: `https://www.meine-domain.de/meine-kategorie/mein-artikel.html`\n\n## Zu welcher Domain gehört der aktuelle Artikel?\n\n```\nrex_yrewrite::getDomainByArticleId(REX_ARTICLE_ID)-\u003egetName();\n```\n\nBeispiel-Rückgabewert: `meine-domain.de`\n\n## Meta-Tags auslesen (`description`, `title`, `image` usw.)\n\nDiesen Codeabschnitt in den `\u003chead\u003e`-Bereich des Templates kopieren:\n\n```php\n$seo = new rex_yrewrite_seo();\necho $seo-\u003egetTags();\n```\n\nDies erzeugt folgende Ausgabe:\n\n```html\n\u003cmeta name=\"description\" content=\"Der Text aus dem Beschreibungs-Feld\"\u003e\n\u003cmeta name=\"robots\" content=\"index, follow\"\u003e\n\u003clink rel=\"canonical\" href=\"https://example.org/de/\"\u003e\n\u003clink rel=\"alternate\" hreflang=\"de\" href=\"https://example.org/de/\"\u003e\n\u003clink rel=\"alternate\" hreflang=\"en\" href=\"https://example.org/en/\"\u003e\n\u003cmeta property=\"og:title\" content=\"Artikelname / Websitetitel\"\u003e\n\u003cmeta property=\"og:description\" content=\"Der Text aus dem Beschreibungs-Feld\"\u003e\n\u003cmeta property=\"og:image\" content=\"https://example.org/media/yrewrite_seo_image/seo-image.jpg\"\u003e\n\u003cmeta property=\"og:image:alt\" content=\"Der Bildtitel aus dem Medienpool\"\u003e\n\u003cmeta property=\"og:image:type\" content=\"image/jpeg\"\u003e\n\u003cmeta property=\"og:url\" content=\"https://example.org/de/\"\u003e\n\u003cmeta name=\"twitter:card\" content=\"summary\"\u003e\n\u003cmeta name=\"twitter:title\" content=\"Artikelname / Websitetitel\"\u003e\n\u003cmeta name=\"twitter:description\" content=\"Der Text aus dem Beschreibungs-Feld\"\u003e\n\u003cmeta name=\"twitter:url\" content=\"https://example.org/de/\"\u003e\n\u003cmeta name=\"twitter:image\" content=\"https://example.org/media/yrewrite_seo_image/seo-image.jpg\"\u003e';\n\u003cmeta name=\"twitter:image:alt\" content=\"Der Bildtitel aus dem Medienpool\"\u003e\n```\n\n## Meta-Tags erweitern / ändern\n\n```php\nrex_extension::register('YREWRITE_SEO_TAGS', function(rex_extension_point $ep) {\n    $tags = $ep-\u003egetSubject();\n    \n    // title-Tag ändern\n    $title = rex_escape('Ein geänderter Titel');\n    $tags['title'] = '\u003ctitle\u003e'.$title.'\u003c/title\u003e';\n    $tags['og:title'] = '\u003cmeta property=\"og:title\" content=\"'.$title.'\"\u003e';\n    $tags['twitter:title'] = '\u003cmeta name=\"twitter:title\" content=\"'.$title.'\"\u003e';\n    \n    // favicon-Tags hinzufügen\n    $tags['favicon'] = '\n            \u003clink rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/assets/favicon/apple-touch-icon.png\"\u003e\n            \u003clink rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/assets/favicon/favicon-32x32.png\"\u003e\n            \u003clink rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/assets/favicon/favicon-16x16.png\"\u003e\n            \u003clink rel=\"manifest\" href=\"/assets/favicon/site.webmanifest\"\u003e\n            \u003clink rel=\"mask-icon\" href=\"/assets/favicon/safari-pinned-tab.svg\" color=\"#5bbad5\"\u003e\n            \u003clink rel=\"shortcut icon\" href=\"/assets/favicon/favicon.ico\"\u003e\n            \u003cmeta name=\"msapplication-TileColor\" content=\"#ffffff\"\u003e\n            \u003cmeta name=\"msapplication-config\" content=\"/assets/favicon/browserconfig.xml\"\u003e\n            \u003cmeta name=\"theme-color\" content=\"#ffffff\"\u003e';\n    $ep-\u003esetSubject($tags);\n});\n\n```\n\n## Navigation Factory in Abhängigkeit der gewählten Domain\n\nWeitere Informaionen zur Navigation Factory des REDAXO-Cores in der API-Dokumentation unter https://REDAXO.org/api/master/ und bei den Tricks von FriendsOfREDAXO: https://github.com/friendsofREDAXO/tricks/\n\n```\n$nav = rex_navigation::factory();\necho $nav-\u003eget(rex_yrewrite::getCurrentDomain()-\u003egetMountId(), 1, TRUE, TRUE);\n```\n\n## Übersicht aller Domains ausgeben\n\n```\n$domains = array_filter(rex_sql::factory()-\u003esetDebug(0)-\u003equery(\\'SELECT * FROM rex_yrewrite_domain\\')\nforeach($domains as $domain) {\n    dump($domain);\n}\n```\n\n# URL-Schemes für YRewrite\n\n## Übersicht\n\nYRewrite kann durch Schemes erweitert werden.\n\n**Installation**\n- Als Datei im `lib`-Ordner des __project-AddOns__ ablegen.\n- Dateiname: `eigene_rewrite_class.php`\n- In die `boot.php` des project-AddOns einsetzen:\n\n```php\n\u003c?php\nif (rex_addon::get(\\'yrewrite\\')-\u003eisAvailable()) {\n    rex_yrewrite::setScheme(new eigene_rewrite_class());\n}\n```\n\nNachfolgend listen wir hier ein paar Beispiele.\n\n## Endung auf .html setzen\n\n```php\n\u003c?php\nclass rex_yrewrite_scheme_mysuffix extends rex_yrewrite_scheme\n{\n    protected $suffix = \\'.html\\';\n}\n```\n\n## Trailing Slash entfernen\n\n```php\n\u003c?php\nclass rex_yrewrite_scheme_mysuffix extends rex_yrewrite_scheme\n{\n    protected $suffix = Null;\n}\n```\n\n## URL-Replacer\n\nErsetzt URLs leerer Elternkategorien mit den URLs der nächsten mit inhalt versehenen (online-)Kindkategorie.\n\n\u003e Basiert auf: https://gist.github.com/gharlan/a70704b1c309cb1281c1\n\n### Weiterleitung egal ob Inhalt in Startartikel der Elternkategorie\n\n```php\n\u003c?php\nclass rex_yrewrite_scheme_gh extends rex_yrewrite_scheme\n{\n    protected $suffix = \\'/\\';\n\n    public function getRedirection(rex_article $art, rex_yrewrite_domain $domain)\n    {\n\n        if ($art-\u003eisStartArticle() \u0026\u0026 ($cats = $art-\u003egetCategory()-\u003egetChildren(true))) {\n            return $cats[0];\n        }\n\n        return false;\n    }\n}\n```\n\n### Weiterleitung nur wenn kein Inhalt im Startartikel der Elternkategorie\n\n```php\n\u003c?php\nclass rex_yrewrite_scheme_gh extends rex_yrewrite_scheme\n{\n    protected $suffix = \\'/\\';\n\n    public function getRedirection(rex_article $art, rex_yrewrite_domain $domain)\n    {\n\n        if ($art-\u003eisStartArticle() \u0026\u0026 ($cats = $art-\u003egetCategory()-\u003egetChildren(true)) \u0026\u0026 !rex_article_slice::getFirstSliceForCtype(1, $art-\u003egetId(), rex_clang::getCurrentId())) {\n            return $cats[0];\n        }\n\n    return false;\n    }\n}\n```\n\n## URL manipulieren, hier mit dem AddOn Sprog\n\nSo kann als Kategoriename ein Platzhalter wie {{contact}} verwendet werden und durch die in Sprog hinterlegten Sprachvarianten ersetzt werden.\n\nOne Level, Kategoriename-Ersetzung durch Sprog.\n\n```php\n\u003c?php\nclass translate_url_with_sprog extends rex_yrewrite_scheme\n{\n\n    public function appendCategory($path, rex_category $cat, rex_yrewrite_domain $domain)\n    {\n        return $path;\n    }\n\n    public function appendArticle($path, rex_article $art, rex_yrewrite_domain $domain)\n    {\n        return $path . \\'/\\' . $this-\u003enormalize(sprogdown($art-\u003egetName(), $art-\u003egetClangId()), $art-\u003egetClangId()) . \\'/\\';\n    }\n}\n```\n\nMultilevel, Kategoriename-Ersetzung durch Sprog.\n\n```php\n\u003c?php\nclass translate_url_with_sprog extends rex_yrewrite_scheme\n{\n    public function appendCategory($path, rex_category $cat, rex_yrewrite_domain $domain)\n    {\n        return $path . \\'/\\' . $this-\u003enormalize(sprogdown($cat-\u003egetName(), $cat-\u003egetClangId()), $cat-\u003egetClangId());\n    }\n}\n```\n\n## Ersetzungsmuster mit einem eigenen Schema verändern\n\nDie Ersetzungsmuster können mit eigenen Schema verändert werden. In diesem Beispiel wird `\u0026` durch `und` getauscht.\n\n1. Datei in den lib-Ordner des Project-AddOns anlegen\n\n```\n\u003c?php\n\nclass rex_project_rewrite_scheme extends rex_yrewrite_scheme\n{\n    /**\n     * @param string $string\n     * @param int $clang\n     *\n     * @return string\n     */\n    public function normalize($string, $clang = 1)\n    {\n        $string = str_replace(\n            ['\u0026'],\n            ['und'],\n            $string\n        );\n\n        // Id 2 = ungarisch\n        if ($clang == 2) {\n            $string = str_replace(\n                ['ő', 'ű'],\n                ['oe', 'ue'],\n                $string\n            );\n        }\n        return parent::normalize($string, $clang);\n    }\n}\n```\n\n2. In der `boot.php`-Datei des `project`-AddOns diesen Code einfügen:\n\n`rex_yrewrite::setScheme(new rex_project_rewrite_scheme());`\n\n## Addons, die eigene Schemes mitbringen:\n\n- YRewrite scheme: https://github.com/FriendsOfREDAXO/yrewrite_scheme\n\n\n# Weitere Unterstützung\n\n* Bug melden via GitHub: https://github.com/yakamara/redaxo_yrewrite/issues/\n* Hilfe via REDAXO Slack-Channel: https://friendsofREDAXO.slack.com/\n* Tricks via FriendsOfREDAXO: https://friendsofredaxo.github.io/tricks/ bei Addons \u003e YRewrite\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyakamara%2Fyrewrite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyakamara%2Fyrewrite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyakamara%2Fyrewrite/lists"}