WordPress-Umleitung zur Site-URL, wenn über den Webpack-Dev-Server-Proxy darauf zugegriffen wird

Lesezeit: 6 Minuten

Benutzer-Avatar
Christian

Diese Frage hat historischen Wert, deshalb aktualisiere ich sie ein wenig. Es ist das Top-Ergebnis für “Webpack-Dev-Server WordPress Redirect” in Google. Während die akzeptierte Lösung für Webpack 2 funktioniert hat, funktioniert sie möglicherweise nicht mehr. Wenn dies nicht der Fall ist, können Sie auf meine verweisen WordPress-Theme-Base-Repositorydas mit Webpack 4 erstellt wurde.


Zuallererst hängt dies damit zusammen, dass WordPress auf localhost statt auf den virtuellen Host umleitet, wenn es von Webpack Dev Server weitergeleitet wird. Ich stehe vor einem ähnlichen Problem, aber die einzige Lösung hat bei mir nicht wirklich etwas gebracht.

Ich verwende WordPress 4.7 in einer Vagrant-Entwicklungsmaschine und es reagiert darauf http://wordpress.local so wie es sein sollte. Zuvor habe ich Browsersync verwendet, um meine Dateien zu überwachen und eine Aktualisierung auszulösen, und dies funktioniert wie erwartet: browser-sync start --proxy 'https://wordpress.local' --files '**/dist/js/*.js, **/*.css, **/*.php'.

Mit webpack-dev-server kann ich das Verhalten jedoch nicht replizieren. Das sollte passieren.

  1. Server startet in https://localhost:9000
  2. Navigieren zu https://localhost:9000 sollte mir dieselbe Seite präsentieren, zu der ich navigiere https://wordpress.local, ohne Umleitungen. Die Seite funktioniert so wie sie war https://wordpress.localaber die URL ist https://localhost:9000.
  3. Änderungen passieren, Seite wird neu geladen.

Stattdessen passiert dies.

  • Navigieren zu https://localhost:9000 Weiterleitungen ich auch https://wordpress.local mit einem 301. Ich habe kanonische Weiterleitungen mit deaktiviert remove_filter('template_redirect', 'redirect_canonical'); hilft aber nicht.
  • Navigieren zu https://localhost:9000/404 präsentiert mir eine 404-Seite, die von meinem Theme bereitgestellt wird. Es erfolgt keine Weiterleitung.
  • Navigieren zu https://localhost:9000/existing-page/ Weiterleitungen ich auch https://localhost/existing-page/ mit 301.

Was zu Hölle ist hier los? Ich habe das Problem auf WordPress eingegrenzt, da das Proxying eines Nicht-WordPress-Verzeichnisses wie erwartet funktioniert:

Direkt, Inhalt von $_SERVER: https://gist.github.com/k1sul1/0aff7ba905464ca7852f2ce00b459922

Proxy, Inhalt von $_SERVER: https://gist.github.com/k1sul1/f090aa103dc3a3cb0b339269560ac19d

Ich habe versucht, mit Headern und dergleichen herumzuspielen, ohne Glück. So sieht meine webpack.config.js aus:

const path = require('path');
const url="https://wordpress.local/";
const themeDir="/wp-content/themes/themename/";

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    publicPath: url
  },
  devServer: {
    historyApiFallback: true,
    compress: true,
    port: 9000,
    https: url.indexOf('https') > -1 ? true : false,
    publicPath: themeDir,
    proxy: {
      '*': {
        'target': url,
        'secure': false
      },
      // "https://stackoverflow.com/": { // This doesn't do much. 
        // target: url,
        // secure: false
      // }
    },
  }
};

TL;DR: Wie repliziere ich das Browsersync-Verhalten mit webpack-dev-server, ohne dass WordPress verrückt spielt?

  • Vielen Dank für den obigen Link zu Ihrem WP-Design mit den aktualisierten Korrekturen, die für mich funktioniert haben! Komisch ist, dass ich damit keine Probleme hatte Umleitung. Wenn ich zu meiner Proxy-URL ging, ging es einfach dorthin. Mein Problem war, dass allen Links auf der Website (dh Navigation) die Portnummer fehlte. Ihre “Header” -Korrektur, um den Zugriff auf WDS-Daten von überall zu ermöglichen, hat dann natürlich meine Probleme gelöst, da ich keine Portnummern habe! Würde mich aber interessieren, warum ich kein Umleitungsproblem hatte…

    – Trevor

    28. April 2020 um 20:26 Uhr

  • Ja, die Links bleiben unverändert, wenn Sie die Proxy-Version verwenden. Zuvor habe ich ein wenig JS verwendet if (module.hot) { fixLinks() } um das Problem zu mindern, aber ich habe aufgehört, es zu verwenden, um direkt zur WordPress-Site zu gehen. @Trevor

    – Christian

    29. April 2020 um 13:38 Uhr


  • Es war nicht immer problemfrei, manchmal, wenn ich ein neues Projekt startete, funktionierte das Hot Reload nicht usw., aber ich denke, diese Probleme wurden durch Fehler in Abhängigkeiten verursacht. Im Moment arbeite ich an einer React-Anwendung, die in WordPress eingebettet ist. Hier ist die Konfiguration: gist.github.com/k1sul1/0d8d9e83037fa2ed9c1a974e93035c25 In diesem Fall verwende ich localhost:8080 als meine Entwickler-URL, die auf WordPress verweist. Auf diese Weise kann ich die Assets mit WordPress-Mechanismen in die Warteschlange einreihen und den Webpack-Dev-Server voll ausnutzen.

    – Christian

    29. April 2020 um 13:44 Uhr

Benutzer-Avatar
Christian

Ich habe das schließlich gelöst. Die magischen Zeilen, die in die Proxy-Konfiguration eingehen, sind changeOrigin: true und autoRewrite: true. Diese Optionen gehen in http-Proxy-Middleware.

Jegliche Änderungen an der WordPress-Domain oder -Konfiguration sind unnötig.

const path = require('path');
const pjson = require(path.join(__dirname, '..', 'package.json'));

const isWin = /^win/.test(process.platform);
const isMac = /^darwin/.test(process.platform);
const isHTTPS = pjson.wptheme.proxyURL.includes('https');

exports.devServer = ({ host, port } = {}) => {
  const options = {
    host: host || process.env.HOST || 'localhost', 
    port: port || process.env.PORT || 8080,
  };
  options.publicPath = (isHTTPS ? 'https' : 'http') + '://' + options.host + ':' + options.port + pjson.wptheme.publicPath;

  return {
    devServer: {
      watchOptions: {
        poll: isWin || isMac ? undefined : 1000,
        aggregateTimeout: 300,
      },

      https: isHTTPS,
      stats: 'errors-only',
      host: options.host,
      port: options.port,
      overlay: {
        errors: true,
        warnings: false,
      },

      open: true,
      hotOnly: true,

      proxy: {
        "https://stackoverflow.com/": {
          target: pjson.wptheme.proxyURL,
          secure: false,
          changeOrigin: true,
          autoRewrite: true,
          headers: {
            'X-ProxiedBy-Webpack': true,
          },
        },
      },

      publicPath: options.publicPath,
    },
  };
};

Die Werte, auf die von package.json verwiesen wird, sehen folgendermaßen aus:

"wptheme": {
  "publicPath": "/wp-content/themes/themefolder/dist/",
  "proxyURL": "https://wordpress.local"
},

  • Wie ändern Sie Ihre Links und Assets in Ihrem Design, um sie automatisch zu verwenden? localhost:8080 während der Entwicklung? Wenn ich benutze define('WP_HOME', 'http://localhost:8080'); WordPress leitet wie in Ihrer ursprünglichen Frage weiter, auch bei Verwendung changeOrigin: true und autoRewrite: true.

    – Bernhardw

    1. März 2019 um 17:52 Uhr


  • Setze WP_HOME nicht. Ich habe den benutzerdefinierten Header verwendet, den ich so eingestellt habe, dass er kein Stylesheet enthält, wenn er über das Webpack angefordert wird, da er nicht existiert (mit JS geladen), höchstwahrscheinlich ist Ihr Ziel falsch. Schau dir changeOrigin hier an: github.com/chimurai/http-proxy-middleware#http-proxy-options

    – Christian

    9. März 2019 um 17:47 Uhr

Es liegt wahrscheinlich an den Umleitungseinstellungen Ihrer WordPress-Site. Wenn Sie auf Ihre Website über zugreifen http://localhost:9000 dann sollte das die Domäne sein, die WordPress bekannt ist.

Legen Sie es im Adminbereich von WordPress oder direkt in der Datenbank fest:

UPDATE `wp_options` SET `option_value` = "http://localhost:9000" WHERE `option_name` = "siteurl" OR `option_name` = "home";

  • Dadurch verliere ich jedoch die Möglichkeit, ohne Proxy auf die Installation zuzugreifen, was zu Problemen führen kann. Ich habe fast volle Parität zwischen Dev- und Prod-Instanzen, und das würde dieser Parität ziemlich schaden 😉 Ich denke, Browsersync dient eher als Man-in-the-Middle-Server, der meine Anfrage unverändert an WordPress sendet und die Antwort umschreibt damit alles weiter funktioniert. Ich denke, ich brauche dafür den Webpack-Dev-Server oder ähnliches.

    – Christian

    23. April 2017 um 11:41 Uhr

  • Derzeit verwende ich nur Browsersync und führe Webpack darüber aus, aber ich würde es lieber über den Dev-Server ausführen, weil es schneller ist.

    – Christian

    23. April 2017 um 11:43 Uhr

  • Anscheinend kann ich mich ändern siteurl und home mit wp-config, ohne die Datenbank tatsächlich zu berühren define(). Ich muss nur irgendwie die Tatsache mitteilen, dass ich webpack-dev-server für WordPress verwende und eine etwas andere Konfiguration anwende. Header in devServer-Einstellungen könnten funktionieren. Haben Sie eine positive Stimme.

    – Christian

    29. April 2017 um 7:30 Uhr

1011230cookie-checkWordPress-Umleitung zur Site-URL, wenn über den Webpack-Dev-Server-Proxy darauf zugegriffen wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy