Contao-Camp 2024
Ergebnis 1 bis 8 von 8

Thema: .htaccess anpassen für Weiterleitung von Domains mit '.html'-Suffix auf ohne '.html'

  1. #1
    Contao-Nutzer
    Registriert seit
    16.09.2018.
    Beiträge
    4

    Frage .htaccess anpassen für Weiterleitung von Domains mit '.html'-Suffix auf ohne '.html'

    Hallo,

    Ich habe in Contao 4.4.24 über die Datei app/config/parameters.yml die Suffixendung '.html' erfolgreich abgeschaltet. So weit so gut.

    Da noch alte Links existieren möchte ich eine Weiterleitung von Domains mit dem Suffix auf eine ohne Suffix durchführen, da sonst immer der Aufruf mit "Error 404" begegnet wird. Soweit ich weiß wird dies in der .htaccess im Verzeichnis web geregelt, bisher waren allerdings unzählige Versuche erfolglos.

    Des weiteren habe ich auch das Problem, wenn am Ende der Domain ein '/' steht die Seite auch nicht gefunden wird. Auch hier würde ich deswegen eine Weiterleitung bauen wollen.

    Vielleicht könnt ihr mir ja verraten, wo und was ich dazu in die .htaccess schreiben muss:
    Code:
    ErrorDocument 404 /app.php/page-not-found
    
    <IfModule mod_rewrite.c>
        RewriteEngine On
    
        <IfModule mod_headers.c>
            # Assets in /assets and /bundles either contain a hash in their filename
            # or are called with a ?version suffix, therefore cache them for 1 year.
            RewriteRule ^(assets|bundles)/ - [ENV=CONTAO_ASSETS:true]
            Header set Cache-Control "max-age=31536000" env=CONTAO_ASSETS
    
            # Allow CORS on the Contao TinyMCE skin.
            RewriteRule ^assets/tinymce4/js/skins/contao/fonts/ - [ENV=CONTAO_TINYMCE_SKIN:true]
            Header set Access-Control-Allow-Origin "*" env=CONTAO_TINYMCE_SKIN
        </IfModule>
    
        # Determine the RewriteBase automatically and set it as environment variable.
        # If you are using Apache aliases to do mass virtual hosting or installed the
        # project in a subdirectory, the base path will be prepended to allow proper
        # resolution of the app.php file and to redirect to the correct URI. It will
        # work in environments without path prefix as well, providing a safe, one-size
        # fits all solution. But as you do not need it in this case, you can comment
        # the following 2 lines to eliminate the overhead.
        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]
    
        # Sets the HTTP_AUTHORIZATION header removed by Apache
        RewriteCond %{HTTP:Authorization} .
        RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    
        # Redirect to URI without front controller to prevent duplicate content
        # (with and without `/app.php`). Only do this redirect on the initial
        # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
        # endless redirect loop (request -> rewrite to front controller ->
        # redirect -> request -> ...).
        # So in case you get a "too many redirects" error or you always get redirected
        # to the start page because your Apache does not expose the REDIRECT_STATUS
        # environment variable, you have 2 choices:
        # - disable this feature by commenting the following 2 lines or
        # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
        #   following RewriteCond (best solution)
        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^app\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
    
        # If the requested filename exists, simply serve it.
        # We only want to let Apache serve files and not directories.
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule ^ - [L]
    
        # Rewrite all other queries to the front controller.
        RewriteRule ^ %{ENV:BASE}/app.php [L]
    
        # Self-made: domain without 'app.php'
        RewriteCond %{HTTP_HOST} !^www\.meine-domain\.de/app\.php/$ [NC]
        RewriteRule ^(.*)$ http://www.meine-domain.de/app.php/$1 [L,R=301]
    
        RewriteCond %{HTTP_HOST} !^www\.meine-ip-vom-dev-server/app\.php/$ [NC]
        RewriteRule ^(.*)$ http://www.meine.domain.de/app.php/$1 [L,R=301]
    
       # Hier habe ich die Zeilen für die Suffix-Weiterleitung immer eingefügt
    
    </IfModule>
    
    <IfModule !mod_rewrite.c>
        <IfModule mod_alias.c>
            # When mod_rewrite is not available, we instruct a temporary redirect of
            # the start page to the front controller explicitly so that the website
            # and the generated links can still be used.
            RedirectMatch 302 ^/$ /app.php/
            # RedirectTemp cannot be used instead
        </IfModule>
    </IfModule>
    Einige Ansätze - Zusammenkopierte aus dem Netz und selbst gebaute:
    Code:
    # without .html
        1)redirect /file.html to /file
        RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
        RewriteRule ^ /%1 [NE,L,R=301]
        # 2)check if /file exists as an .html ,if it exists ,rewrite /file to /file.html
        # RewriteCond %{REQUEST_FILENAME}.html -f
    
        RewriteCond %{THE_REQUEST} \.html
    
        RewriteRule ^(.*)\.html$ /$1 [R=301,L]
    
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
    
        RewriteRule (.+)\.html$ /$1/ [L,R=301]
        RewriteRule ^([^\.]+)$ $1.html [NC,L]
        RewriteRule ^(.*)\.html$ /$1 [L,R=301]
        RewriteRule ^([^\.]+)$ $1.html [NC,L]
        RewriteRule ^(.*).html$ http://www.my-domain.com/$1 [L,R=301]
        RewriteRule ^(.*?)/?$ /$1.html [L]
        RewriteRule ^\.html$ /$1 [R=301,L]
        RewriteRule ^/$ /$1 [R=301,L]
    Vielen Dank schonmal!

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.895
    Partner-ID
    10107

    Standard

    Die Anweisung
    Code:
    ErrorDocument 404 /app.php/page-not-found
    brauchst du theoretisch nicht, da sowieso jede Ressource, die nicht vorhanden ist, über die app.php abgearbeitet wird.

  3. #3
    Contao-Nutzer
    Registriert seit
    16.09.2018.
    Beiträge
    4

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Die Anweisung
    Code:
    ErrorDocument 404 /app.php/page-not-found
    brauchst du theoretisch nicht, da sowieso jede Ressource, die nicht vorhanden ist, über die app.php abgearbeitet wird.
    Danke, das habe ich gleich mal raus genommen. Das stammt noch aus der Zeit, als ich Probleme mit der "Error 404"-Seite und Domains ohne "app.php" drin hatte.

    Leider ändert das ja nichts am eigentlichen Problem, oder?
    Geändert von wieland (16.09.2018 um 15:37 Uhr)

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.895
    Partner-ID
    10107

    Standard

    Deine Weiterleitungen müssen nach
    Code:
        # If the requested filename exists, simply serve it.
        # We only want to let Apache serve files and not directories.
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule ^ - [L]
    und vor
    Code:
        # Rewrite all other queries to the front controller.
        RewriteRule ^ %{ENV:BASE}/app.php [L]
    rein.

  5. #5
    Contao-Nutzer
    Registriert seit
    16.09.2018.
    Beiträge
    4

    Standard

    Vielen Dank schon mal für den Hinweis.
    Leider sind meine bisherigen Versuche dennoch vergeblich. Bei dem Suffixen '.html' und '/' springt immer noch meine Error 404 Seite an anstatt einer Weiterleitung.

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.895
    Partner-ID
    10107

    Standard

    Poste deine .htaccess

  7. #7
    Contao-Nutzer
    Registriert seit
    16.09.2018.
    Beiträge
    4

    Standard

    Ist eigentlich immer noch das vom ersten Post, ich habe derweil alles wieder durchprobiert.

    Code:
    <IfModule mod_rewrite.c>
        RewriteEngine On
    
        <IfModule mod_headers.c>
            # Assets in /assets and /bundles either contain a hash in their filename
            # or are called with a ?version suffix, therefore cache them for 1 year.
            RewriteRule ^(assets|bundles)/ - [ENV=CONTAO_ASSETS:true]
            Header set Cache-Control "max-age=31536000" env=CONTAO_ASSETS
    
            # Allow CORS on the Contao TinyMCE skin.
            RewriteRule ^assets/tinymce4/js/skins/contao/fonts/ - [ENV=CONTAO_TINYMCE_SKIN:true]
            Header set Access-Control-Allow-Origin "*" env=CONTAO_TINYMCE_SKIN
        </IfModule>
    
        # Determine the RewriteBase automatically and set it as environment variable.
        # If you are using Apache aliases to do mass virtual hosting or installed the
        # project in a subdirectory, the base path will be prepended to allow proper
        # resolution of the app.php file and to redirect to the correct URI. It will
        # work in environments without path prefix as well, providing a safe, one-size
        # fits all solution. But as you do not need it in this case, you can comment
        # the following 2 lines to eliminate the overhead.
        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]
    
        # Sets the HTTP_AUTHORIZATION header removed by Apache
        RewriteCond %{HTTP:Authorization} .
        RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    
        # Redirect to URI without front controller to prevent duplicate content
        # (with and without `/app.php`). Only do this redirect on the initial
        # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
        # endless redirect loop (request -> rewrite to front controller ->
        # redirect -> request -> ...).
        # So in case you get a "too many redirects" error or you always get redirected
        # to the start page because your Apache does not expose the REDIRECT_STATUS
        # environment variable, you have 2 choices:
        # - disable this feature by commenting the following 2 lines or
        # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
        #   following RewriteCond (best solution)
        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^app\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
    
        # If the requested filename exists, simply serve it.
        # We only want to let Apache serve files and not directories.
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule ^ - [L]
    
        # Redirect if '.html'-Suffix in Domain
        RewriteRule ^(.*)\.html$ http://mein.webseite/$1 [L,R=301]
    
        # Diverse zusammenkopierte - vergebliche - Versuche
        # 1)redirect /file.html to /file
        # RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
        # RewriteRule ^ /%1 [NE,L,R=301]
        # RewriteCond %{THE_REQUEST} \.html
        # RewriteRule ^(.*)\.html$ /$1 [R=301,L]
        # RewriteCond %{REQUEST_FILENAME} !-f
        # RewriteCond %{REQUEST_FILENAME} !-d
        # RewriteRule (.+)\.html$ /$1/ [L,R=301]
        # RewriteRule ^([^\.]+)$ $1.html [NC,L]
        # RewriteRule ^(.*)\.html$ /$1 [L,R=301]
        # RewriteRule ^([^\.]+)$ $1.html [NC,L]
        # RewriteRule ^(.*).html$ http://www.my-domain.com/$1 [L,R=301]
        # 2)check if /file exists as an .html ,if it exists ,rewrite /file to /file.html
        # RewriteCond %{REQUEST_FILENAME}.html -f
        # RewriteRule ^(.*?)/?$ /$1.html [L]
        # selfmade try without html
        # RewriteRule ^\.html$ /$1 [R=301,L]
        # RewriteRule ^/$ /$1 [R=301,L]
    
    
        # Rewrite all other queries to the front controller.
        RewriteRule ^ %{ENV:BASE}/app.php [L]
    
        # Self-made: from domain direct to app.php
        RewriteCond %{HTTP_HOST} !^www\.meine\.webseite\.de/app\.php/$ [NC]
        RewriteRule ^(.*)$ http://www.meine.webseite.de/app.php/$1 [L,R=301]
    
        RewriteCond %{HTTP_HOST} !^www\.ip.\meiner\.webseite/app\.php/$ [NC]
        RewriteRule ^(.*)$ http://www.meine.webseite.de/app.php/$1 [L,R=301]
    
    
    </IfModule>
    
    <IfModule !mod_rewrite.c>
        <IfModule mod_alias.c>
            # When mod_rewrite is not available, we instruct a temporary redirect of
            # the start page to the front controller explicitly so that the website
            # and the generated links can still be used.
            RedirectMatch 302 ^/$ /app.php/
            # RedirectTemp cannot be used instead
        </IfModule>
    </IfModule>

  8. #8
    Contao-Nutzer
    Registriert seit
    08.10.2018.
    Beiträge
    12

    Standard

    Der Thread ist zwar schon ein bisschen älter, aber da ich gerade auch die Lösung hierzu suche, poste ich hier mal meine Ansätze dazu. Bei mir ist Contao 4.4.20 installiert.

    Laut Contao Academy ist folgendes korrekt (allerdings ursprünglich für Contao 3.5):
    Code:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (.*)\.html$ /$1 [L,R=301]
    Bei Stack Overflow habe ich folgendes gefunden:
    Code:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.html [NC,L]
    Beide Ansätze führen für mich nicht zum Ziel, allerdings habe ich die Vermutung, dass sich bei mir die 404-Seite (mit Weiterleitung zur Startseite) davorschiebt, denn alles, was nicht genau dem Pfad entspricht, wird auf die Startseite umgeleitet...

    Wie verhindere ich jetzt, dass die 404 sich davorschiebt??

    MfG Mathis

    EDIT: Okay, ich bin natürlich in die 301-Redirect-Falle getappt. Der Browser hatte die Redirects schon gespeichert und nur das Aufrufen der einzelnen Webseiten über die DevTools mit "Network" -> "[x] Disable Cache" hat die 301-Redirects gelöscht und korrigiert. Hoffentlich hab ich das schnell genug gefunden, sodass möglichst kein anderer die Redirects im Browser hat...

    Aber die gute Nachricht ist: Die Contao-Academy-Variante ist korrekt.
    Geändert von mv_wueins (14.10.2019 um 15:18 Uhr)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •