Support » Allgemeine Fragen » Blocked by CORS

  • Gelöst laluluny

    (@laluluny)


    Hallo,
    auf meiner Seite http://www.no2do.com binde ich auf diversen Unterseiten (z.B. hier: https://no2do.com/hexagramme/778787.htm) Teile aus einem WP-Auftritt ein, der unter der selben Domain läuft.

    Bei der Seite https://no2do.com/hexagramme/778787.htm werde z.B.
    (wenn es funktioniert) im Abschnitt Beispielhafte Erfahrungen
    Teile der Seite https://www.no2do.com/synopse/archives/68 eingebunden
    und im Abschnitt Unterstützen Sie no2DO: Geben Sie mir Feedback!
    Teile der Seite https://www.no2do.com/synopse/kontakt

    Das alles lief während der letzten Jahre einwandfrei, heute habe ich zufälligerweise festgestellt, dass es nicht mehr läuft und ich folgende Fehlermeldung bekomme:

    778787.htm:
    1 Access to XMLHttpRequest at 'https://www.no2do.com/synopse/kontakt' (redirected from 'https://no2do.com/synopse/kontakt') from origin 'https://no2do.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
    www.no2do.com/synopse/kontakt:1 Failed to load resource: net::ERR_FAILED
    778787.htm:
    1 Access to XMLHttpRequest at 'https://www.no2do.com/synopse/archives/68' (redirected from 'https://no2do.com/synopse/archives/68') from origin 'https://no2do.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
    www.no2do.com/synopse/archives/68:1 Failed to load resource: net::ERR_FAILED

    Ich habe das Problem gegoogelt und auch eine Lösung gefunden, die zu funktionieren schien: https://robertmarshall.dev/blog/wordpress-rest-api-cors-issues/

    D.h. ich habe meine functions.php im Child-Theme entsprechend ergänzt. Folge: die Abschnitte wurden wieder eingebunden. 🙂

    ABER: als ich dann an der Seite arbeiten wollte (im Block Editor), konnte ich die Änderungen nicht mehr abspeichern. Als ich unter WERKZEUGE den WP-Zustand prüfte, wurde bemängelt, dass sich die REST-API ungewöhnlich verhält, und weil der Block-Editor mit der REST-API arbeitet könne es zu Problemen kommen. 🙁

    Ich habe dann meine functions.php in den Originalzustand zurückversetzt, jetzt werden die Abschnitte wieder nicht-eingebaut, dafür kann ich im Block-Editor meine Seiten editieren und abspeichern…

    Habt ihr Rat für mich?
    Danke schon jetzt und viele Grüße
    Karin

    Die Seite, für die ich Hilfe brauche: [Anmelden, um den Link zu sehen]

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Thread-Starter laluluny

    (@laluluny)

    PS, just in case: Die ergänzte functions.php hat folgenden Inhalt:

    <?php
    /**
    * Child theme stylesheet einbinden in Abhängigkeit vom Original-Stylesheet
    Und einen Fehler mit WordPress REST API CORS loesen per
    https://robertmarshall.dev/blog/wordpress-rest-api-cors-issues/
    */
    
    function child_theme_styles() {
    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
    wp_enqueue_style( 'child-theme-css', get_stylesheet_directory_uri() .'/style.css' , array('parent-style'));
    
    }
    
    add_action('init', 'handle_preflight');
    function handle_preflight() {
        $origin = get_http_origin();
        if ($origin === 'https://www.no2do.com/synopse') {
            header("Access-Control-Allow-Origin: https://www.no2do.com/synopse");
            header("Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE");
            header("Access-Control-Allow-Credentials: true");
            header('Access-Control-Allow-Headers: Origin, X-Requested-With, X-WP-Nonce, Content-Type, Accept, Authorization');
            if ('OPTIONS' == $_SERVER['REQUEST_METHOD']) {
                status_header(200);
                exit();
            }
        }
    }
    add_filter('rest_authentication_errors', 'rest_filter_incoming_connections');
    function rest_filter_incoming_connections($errors) {
        $request_server = $_SERVER['REMOTE_ADDR'];
        $origin = get_http_origin();
        if ($origin !== 'https://www.no2do.com/synopse') return new WP_Error('forbidden_access', $origin, array(
            'status' => 403
        ));
        return $errors;
    }
    add_action( 'wp_enqueue_scripts', 'child_theme_styles' );?>
    Thread-Starter laluluny

    (@laluluny)

    Eckdaten

    WordPress
    Version	6.2.2
    Umgebungstyp	production
    Verbindung mit WordPress.org	WordPress.org ist erreichbar
    
    
    Server 
    Server-Architektur	Linux 4.18.0-372.32.1.lve.el7h.x86_64 x86_64
    Webserver	LiteSpeed
    PHP-Version	8.1.18 (Unterstützt 64bit-Werte)
    PHP-SAPI	litespeed
    cURL-Version	7.87.0 OpenSSL/1.1.1p
    .htaccess-Regeln	Individuelle Regeln wurden deiner .htaccess-Datei hinzugefügt.
    
    Datenbank
    Erweiterung	mysqli
    Server-Version	10.3.38-MariaDB-log-cll-lve
    Client-Version	mysqlnd 8.1.18
    
    WordPress-Konstanten 
    ABSPATH	/home/no2do/public_html/synopse/
    WP_HOME	Nicht definiert
    WP_SITEURL	Nicht definiert
    WP_CONTENT_DIR	/home/no2do/public_html/synopse/wp-content
    WP_PLUGIN_DIR	/home/no2do/public_html/synopse/wp-content/plugins
    WP_MEMORY_LIMIT	256M
    WP_MAX_MEMORY_LIMIT	256M
    WP_DEBUG	Deaktiviert
    WP_DEBUG_DISPLAY	Deaktiviert
    WP_DEBUG_LOG	Deaktiviert
    SCRIPT_DEBUG	Deaktiviert
    WP_CACHE	Aktiviert
    CONCATENATE_SCRIPTS	Nicht definiert
    COMPRESS_SCRIPTS	Nicht definiert
    COMPRESS_CSS	Nicht definiert
    WP_ENVIRONMENT_TYPE	Nicht definiert
    DB_CHARSET	utf8
    DB_COLLATE	
    
    Dateisystem-Berechtigungen 
    alles beschreibbar

    Hallo,
    leider verstehe ich nicht so ganz, warum du das so kompliziert einbindest.

    Wenn ich das Problem richtig verstanden habe, dann kannst du doch „Teile aus einem WP-Auftritt, der unter der selben Domain läuft“ bei Verwendung des Block Editors z. B. als wiederverwendbaren Block einbinden. Das wäre nach meinem Verständnis eine wesentlich einfachere Lösung und du könntest dir die Zeilen in der functions.php sparen.

    Viele Grüße
    Hans-Gerd

    Thread-Starter laluluny

    (@laluluny)

    Hallo Hans-Gerd,

    Danke für deine Rückmeldung.

    Aber, oh, da hast du mich missverstanden: die Seite(n), auf denen jeweils ganz unterschiedliche (WordPress-)Seiten(Teile) eingebunden werden, sind ganz normale, statische (!) HTML-Seiten.
    Beispiel: https://no2do.com/hexagramme/778787.htm

    Nur das, was eingebunden wird, kommt von WP.

    Aber wegen „Blocked by CORS“ erlaubt WP eben leider nicht, dass Teile des WP-Auftritts irgendwoanders eingebunden werden…

    Klarer?
    (klarer auch, warum wiederverwendbare Blöcke nicht weiterhelfen? Weil die Seite, die einbindet, ja keine WP- sondern eine HTML-Seite ist…)

    Danke und LG,
    Karin

    Wenn du in WordPress Permalinks einrichtest, legt WordPress eine .htaccess mit Weiterleitungsregeln an. Die besagen – sehr laienhaft ausgedrückt – „wenn das aufgerufene Verzeichnis oder die Datei nicht vorhanden ist, dann übergib den Slug und Parameter an die index.php von WordPress, damit der entsprechende Beitrag oder die Seite ausgegeben wird“. Das kannst du für die Einbindung statischer Seiten nutzen: ist eine html-Datei vorhanden, tritt WordPress gar nicht erst in Erscheinung.

    Das zu nutzen, erscheint mir einfacher und weniger fehleranfällig, als der bisher verwendete Code.

    Thread-Starter laluluny

    (@laluluny)

    Lieber pixolin,

    Vielen Dank für deine Antwort – aber darum geht es nicht, es geht nicht um Weiterleitungen etc.

    Womit man das, was ich da mache, vielleicht vergleichen könnte, sind die uralten SSIs – Server Side Includes (https://de.wikipedia.org/wiki/Server_Side_Includes), das war eine alte Technologie, die man vor… 15? Jahren verwendet hat.

    Anders ausgedrückt: meine HTML-Seiten holen sich andere Seiten – die Teil der WP-Installation sind – und binden Sie in die Gesamtseite ein. Das Problem („Blocked by CORS“) ist, dass WP offenbar NICHT(mehr) ERLAUBT, dass Teile von WP-Seiten irgendwo eingebunden werden…

    LG, Karin

    Thread-Starter laluluny

    (@laluluny)

    PS: Vielleicht kann ich das Problem folgendermaßen präzisieren:

    • Ich binde in statische Html-Seiten Elemente aus einer WP-Seite ein. Funktionierte früher problemlos, funktioniert jetzt nicht mehr.
    • Im Netz fand ich eine Lösung (https://robertmarshall.dev/blog/wordpress-rest-api-cors-issues/), implementierte sie, die Einbindung klappte wieder
    • Aber diese Lösung verhindert, dass der Block-Editor korr. funktioniert: man kann Seiten, die man bearbeitet hat, nicht mehr abspeichern.

    Daraus ergibt sich meine Frage: Warum ist das so? Was macht dieses Script (aus der „Lösung“, s.o.), das dazu führt, dass nun der Block-Editor „spinnt“?

    Ich habe jetzt auch noch eine weitere „Anleitung“ ergoogelt: https://webdevstudios.com/2020/11/17/resolve-cors-errors/
    Leider bin ich kein Programmierer… ich checke das mit dem Code nicht; der Autor erklärt eine ganze Menge, aber mir ist nicht klar, mit welcher Zeile magischen Codes ich alles wieder zum Laufen bekomme…

    Und hier ist auch nochmal was ähnliches: https://wordpress.org/support/topic/cors-error-13/ – sehr aktuell…

    Danke und Grüße,
    Karin

    Moderationshinweis: deine Antwort wurde von der Forensoftware zurückgehalten. Ich musste die Antwort erst freischalten.

    • Diese Antwort wurde geändert vor 10 Monaten, 3 Wochen von laluluny.
    • Diese Antwort wurde geändert vor 10 Monaten, 3 Wochen von Hans-Gerd Gerhards.
    • Diese Antwort wurde geändert vor 10 Monaten, 3 Wochen von Hans-Gerd Gerhards.
    • Diese Antwort wurde geändert vor 8 Monaten, 3 Wochen von Hans-Gerd Gerhards.
    Moderator Michi91

    (@michi91)

    Hey Karin,

    Gibt es einen Grund, dass du dir Domain einmal mit www. und einmal ohne betreibst bzw. aufrufst? Wenn die Domain gleich bleiben würde, gäbe es das Problem nicht.

    Hab heute wenig Zeit, dir einen passenden PHP Schnipsel zu bauen, damit es auch mit zwei Domains funktioniert, würde mich aber mofgen nochmal melden, wenn du es nicht auf eine Domain umstellen kannst.

    Edit: Wenn es Jetz schon funktioniert, nur der Editor nicht mehr, reicht es vermutlich folgende code Zeilen wieder zu entfernen.

    add_filter('rest_authentication_errors', 'rest_filter_incoming_connections');
    function rest_filter_incoming_connections($errors) {
        $request_server = $_SERVER['REMOTE_ADDR'];
        $origin = get_http_origin();
        if ($origin !== 'https://www.no2do.com/synopse') return new WP_Error('forbidden_access', $origin, array(
            'status' => 403
        ));
        return $errors;
    }
    • Diese Antwort wurde geändert vor 10 Monaten, 3 Wochen von Michi91.
    Thread-Starter laluluny

    (@laluluny)

    Lieber Michi91,

    gute Frage: dass die Domain mit und ohne www erreichbar ist, ist mir garnicht aufgefallen – danke für den Hinweis! Ich kümmere mich darum (ich bin ein copy-paste-Idiot und frage gerade bei meinem Hostern nach, was ich dazu in die .htaccess-Datei schreiben muss). Issue ist also in Arbeit.

    Ggf. war dass der Grund, warum der Block-Editor ausgestiegen ist, wenn ich das PHP-sniplet eingefügt habe, um das CORS-Problem zu lösen (s.o.)? Vielleicht….

    Ich habe inzwischen weiter gegoogelt und bin auf ein ähnliches issue im englischsprachigen WP-Forum gestoßen: https://wordpress.org/support/topic/cors-error-13/

    Dort wird empfohlen, ein bisschen Code in die .htaccess-Datei einzufügen:

    SetEnvIf Origin “(http://localhost:5174)$” AccessControlAllowOrigin=$0
    Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header set Access-Control-Allow-Credentials true
    Header always set Access-Control-Allow-Methods “POST,GET,OPTIONS,DELETE,PUT”
    Header always set Access-Control-Max-Age “3600”
    Header always set Access-Control-Allow-Headers “Content-Type,Authorization”

    Ich habe das gemacht, und zwar in der .htaccess-Datei, die im WP-Verzeichnis liegt – und das Resultat ist:
    1) Funktioniert, die WP-Teile werden wieder in die statischen Seiten eingebunden
    2) Block Editor funktioniert auch, bei Werkzeuge->Website-Zustand ist alles Roger. 🙂

    Also, ich werde mich jetzt noch drum kümmern, dass meine Seite ausschließlich MIT .www erreichbar ist, weil, dass habe ich auch gerade festgestellt: wenn ich ohne www. aufrufe, werden die WP-Teile wieder NICHT eingebunden… sobald ich mit www. aufrufe wieder schon…
    Aber, wie gesagt, das klär ich mit meinem Hoster, ist ja kein WP-Issue. 🙂

    Also, ich danke ich euch allen SEHR HERZLICH für euren Support!
    Issue resolved (so weit ich das aktuell sehe…) 🙂
    LG, Karin

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Das Thema „Blocked by CORS“ ist für neue Antworten geschlossen.