Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yakamara/redaxo_yrewrite
A multidomain URL rewrite engine for REDAXO
https://github.com/yakamara/redaxo_yrewrite
hacktoberfest php redaxo rewrite-urls
Last synced: 3 months ago
JSON representation
A multidomain URL rewrite engine for REDAXO
- Host: GitHub
- URL: https://github.com/yakamara/redaxo_yrewrite
- Owner: yakamara
- License: mit
- Created: 2012-12-07T14:38:54.000Z (almost 12 years ago)
- Default Branch: main
- Last Pushed: 2024-05-06T12:42:41.000Z (6 months ago)
- Last Synced: 2024-05-06T14:23:12.720Z (6 months ago)
- Topics: hacktoberfest, php, redaxo, rewrite-urls
- Language: PHP
- Homepage:
- Size: 630 KB
- Stars: 56
- Watchers: 13
- Forks: 34
- Open Issues: 51
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# YRewrite
## Übersicht
Das AddOn YRewrite für REDAXO erweitert das CMS um "sprechende" URLs und unterstützt den Betrieb mehrerer Domains.
REDAXO ohne Rewriter-AddOn erstellt Urls nach dem Schema `index.php?article_id=13&clang=1`zur Vefügung. YRewrite bietet lesbare URLs wie z.B. `/de/news/archiv/` in verschiedenen Schemata.Mehrere Domains können dann sinnvoll sein, wenn
* mehrere Websites eines Kunden in einer Installation verwaltet werden,
* verschiedene Sprachen (`clang`) einer Website unter unterschiedlichen Domains oder Subdomains erreichbar sind,
* oder beides.> Tipp: Wir empfehlen im ersten Fall, für jede einzelne Domain in der Struktur auf der obersten Ebene eine Kategorie anzulegen.
## Features
* Mehrere Domains in einer Webseite verwaltbar
* Sprachabhängigkeiten von Domains zuweisbar
* Domain- und sprachabhängige ROBOTS.txt-Anweisungen und XML-Sitemaps
* Individuelle URL pro Artikel möglich
* Seitentitel-Schema definierbar / pro Domain/Sprache
* Alias Domains die auf die Hauptdomain verweisen
* Allgemeine Weiterleitungen. URLs zu internen Artikeln, Dateien, externen Artikeln, sogar Protokoll-Tausch in bspw. `tel:`, `mailto:` u.a.
* Canonical Urls## Installation
Voraussetzung für die aktuelle Version von YRewrite: REDAXO >= 5.5
* Über das REDAXO-Backend installieren und aktivieren
* Setup ausführen# Erste Schritte
## Setup
Unter 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.
### Apache-Konfiguration für YRewrite
Das 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").
> **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.
> **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.
### NGINX-Konfiguration für YRewrite
Eine vollständige nginx config für YRewrite.
> Hinweis für PLESK-Websites: Die Direktiven können unter ***Einstellungen für Apache & nginx*** der gewünschten Domain im Abschnitt ***Zusätzliche nginx-Anweisungen*** hinterlegt werden.
```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;
}
```## Domain hinzufügen
1. In "YRewrite" unter "Domains" Auf das +-Zeichen klicken.
2. Domain eintragen, bspw. `https://www.meine-domain.de/`.
3. 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).
4. Startseiten-Artikel auswählen. Das kann der Mount-Artikel sein oder eine separate Artikelseite. Diese wird als Startseite der Domain aufgerufen.
5. 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.
6. Spracheinstellungen: Hier können Sprachen ausgewählt werden, die mit der Domain verknüpft werden. So lassen sich bspw. unterschiedliche Domains pro Sprache umsetzen.
7. Titelschema eintragen, bspw. `%T - Meine Domain`. Dieses Titelschema kann dann im Website-Template ausgegeben werden.
8. robots.txt-Einstellungen hinzufügen. Siehe Tipp unten.
9. Domain hinzufügen.Diese Vorgehensweise für alle gewünschten Domains wiederholen.
> **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
> **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.`
> **Hinweis:** Domains mit Umlauten bitte derzeit decodiert eintragen. Umwandlung bspw. mit https://www.punycoder.com
> **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.
## Alias-Domain hinzufügen
Alias-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`.
Alias-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.
1. In "YRewrite" unter "Domains" Auf das +-Zeichen klicken
2. Alias-Domain eintragen, bspw. `https://www.meine-domain.de/`
3. Ziel-Domain aus YRewrite auswählen
4. Alias-Domain hinzufügen## Weiterleitungen
Unter Weiterleitungen können URLs definiert werden, die dann auf einen bestimmten Artikel oder eine andere Adresse umgeleitet werden.
> **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.
> **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.
## Weitere Schritte
Die `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.
# Klassen-Referenz
## YRewrite-Objekt
Siehe auch: https://github.com/yakamara/redaxo_yrewrite/blob/main/lib/yrewrite/yrewrite.php
```
$yrewrite = new rex_yrewrite;
// dump($yrewrite); // optional alle Eigenschaften und Methoden anzeigen
```**Methoden**
```
```## YRewrite-Domain-Objekt
Siehe auch: https://github.com/yakamara/redaxo_yrewrite/blob/main/lib/yrewrite/domain.php
```
$domain = rex_yrewrite::getCurrentDomain();
dump($domain); // optional alle Eigenschaften und Methoden anzeigen
```**Methoden**
```
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-ObjektSiehe auch: 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
```**Methoden**
```
```# Beispiele
## ID der aktuellen Domain in YRewrite
```
rex_yrewrite::getCurrentDomain()->getId();```
Beispiel-Rückgabewert: `1`
## Mount-ID der Domain
```
rex_yrewrite::getCurrentDomain()->getMountId();
```Beispiel-Rückgabewert: `5`
## Startartikel-ID der Domain
```
rex_yrewrite::getCurrentDomain()->getStartId();
```Beispiel-Rückgabewert: `42`
## Fehler-Artikel-ID der Domain
```
rex_yrewrite::getCurrentDomain()->getNotfoundId();
```Beispiel-Rückgabewert: `43`
## Name der aktuellen Domain
```
rex_yrewrite::getCurrentDomain()->getName();
```Beispiel-Rückgabewert: `meine-domain.de`
## vollständige URL eines Artikels
```
rex_yrewrite::getFullUrlByArticleId(42);
```Beispiel-Rückgabewert: `https://www.meine-domain.de/meine-kategorie/mein-artikel.html`
## Zu welcher Domain gehört der aktuelle Artikel?
```
rex_yrewrite::getDomainByArticleId(REX_ARTICLE_ID)->getName();
```Beispiel-Rückgabewert: `meine-domain.de`
## Meta-Tags auslesen (`description`, `title`, `image` usw.)
Diesen Codeabschnitt in den ``-Bereich des Templates kopieren:
```php
$seo = new rex_yrewrite_seo();
echo $seo->getTags();
```Dies erzeugt folgende Ausgabe:
```html
';
```
## Meta-Tags erweitern / ändern
```php
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.'';
$tags['og:title'] = '';
$tags['twitter:title'] = '';
// favicon-Tags hinzufügen
$tags['favicon'] = '
';
$ep->setSubject($tags);
});```
## Navigation Factory in Abhängigkeit der gewählten Domain
Weitere 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/
```
$nav = rex_navigation::factory();
echo $nav->get(rex_yrewrite::getCurrentDomain()->getMountId(), 1, TRUE, TRUE);
```## Übersicht aller Domains ausgeben
```
$domains = array_filter(rex_sql::factory()->setDebug(0)->query(\'SELECT * FROM rex_yrewrite_domain\')
foreach($domains as $domain) {
dump($domain);
}
```# URL-Schemes für YRewrite
## Übersicht
YRewrite kann durch Schemes erweitert werden.
**Installation**
- Als Datei im `lib`-Ordner des __project-AddOns__ ablegen.
- Dateiname: `eigene_rewrite_class.php`
- In die `boot.php` des project-AddOns einsetzen:```php
isAvailable()) {
rex_yrewrite::setScheme(new eigene_rewrite_class());
}
```Nachfolgend listen wir hier ein paar Beispiele.
## Endung auf .html setzen
```php
Basiert auf: https://gist.github.com/gharlan/a70704b1c309cb1281c1### Weiterleitung egal ob Inhalt in Startartikel der Elternkategorie
```php
isStartArticle() && ($cats = $art->getCategory()->getChildren(true))) {
return $cats[0];
}return false;
}
}
```### Weiterleitung nur wenn kein Inhalt im Startartikel der Elternkategorie
```php
isStartArticle() && ($cats = $art->getCategory()->getChildren(true)) && !rex_article_slice::getFirstSliceForCtype(1, $art->getId(), rex_clang::getCurrentId())) {
return $cats[0];
}return false;
}
}
```## URL manipulieren, hier mit dem AddOn Sprog
So kann als Kategoriename ein Platzhalter wie {{contact}} verwendet werden und durch die in Sprog hinterlegten Sprachvarianten ersetzt werden.
One Level, Kategoriename-Ersetzung durch Sprog.
```php
normalize(sprogdown($art->getName(), $art->getClangId()), $art->getClangId()) . \'/\';
}
}
```Multilevel, Kategoriename-Ersetzung durch Sprog.
```php
normalize(sprogdown($cat->getName(), $cat->getClangId()), $cat->getClangId());
}
}
```## Ersetzungsmuster mit einem eigenen Schema verändern
Die Ersetzungsmuster können mit eigenen Schema verändert werden. In diesem Beispiel wird `&` durch `und` getauscht.
1. Datei in den lib-Ordner des Project-AddOns anlegen
```
YRewrite