.htaccess mit WordPress-Plugin umschreiben

Lesezeit: 6 Minuten

Benutzeravatar von Dustin Snider
Dustin Snider

Ich arbeite daran, ein WordPress-Plugin für ein benutzerdefiniertes WordPress-Multisite-Netzwerk zu erstellen, und habe einige Dateien, die URL-Variablen verwenden, um Informationen aus einer zweiten Datenbank (nicht der WordPress-Datenbank) zu laden.

In der Version, die außerhalb von WordPress erstellt wurde, indem Sie zu navigieren http://website.com/NAME-HERE Es würde prüfen, ob es sich um einen Benutzernamen in meiner Datenbank handelt, wenn nicht, um zu sehen, ob es sich um eine Gruppe in meiner Datenbank handelt, und die entsprechende Datei laden, wenn es sich um einen Benutzernamen oder eine Gruppe handelt.

Jetzt bin ich völlig verwirrt darüber, dies in WordPress Multisite zu implementieren. Soweit ich weiß, können Plugins das nicht machen .htaccess umschreibt? Wie kann ich es auf allen Netzwerkseiten zum Laufen bringen?

Wenn nicht, was ist der beste Weg, dies zu erreichen?

Muss ich meine platzieren pretty.php & .htaccess in mein Root-Verzeichnis umschreiben und die Seiten auf die Dateien verweisen, die sich im Plugin befinden? Wenn ja, wie funktioniert das mit mehreren Themen?

An diesem Punkt dachte ich, dass es am besten wäre, sich an die StackOverflow-Community zu wenden, um Hilfe oder Anweisungen zu erhalten.

.htaccess

RewriteEngine On  
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]  
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]  

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA]

ErrorDocument 404 /404.php

hübsch.php

// First check if passed pretty parameter is a username.
if(checkIfUserByUsername($_GET['pretty']))
{
    $_GET['username'] = $_GET['pretty'];
    
    include("USERNAME.php");

// If not a username, check to see if it's an event.
}else if(checkIfStreamByPretty($_GET['pretty'])){
    $_GET['id'] = getStreamIdFromPretty($_GET['pretty']);
    
    include("GROUP.php");
}else{
    // If it's none, redirect to the 404 page.

    include("404.php");
}

  • Es ist nicht klar, was Sie als gewünschtes Ergebnis erreichen möchten. Bitte brechen Sie Ihre Frage auf, um präziser zu formulieren, was Sie eigentlich wollen, im Gegensatz zu den Kämpfen, auf die Sie gestoßen sind. Wie für Änderungen an .htaccess Sie könnten andere Plugins auschecken, die Änderungen an der vornehmen .htaccess Datei, wie z All In One WP Security & Firewall.

    – Wird B.

    29. September 2017 um 1:50 Uhr

  • Wenn ich zu example.com/Dustin gehe, prüft es, ob es sich um einen Benutzernamen oder eine Gruppe handelt, und zeigt die Seitenvorlagendatei an, für die es sich handelt.

    – Dustin Snider

    29. September 2017 um 2:58 Uhr

  • aber es muss auch für die Multisites funktionieren, die so erstellt wurden example.com/SITE/Dustin

    – Dustin Snider

    29. September 2017 um 3:21 Uhr

Benutzeravatar von jgile
jgil

Es gibt eine Handvoll Möglichkeiten, wie Sie dies angehen können, wenn ich verstehe, was Sie erreichen möchten. Sie müssen wahrscheinlich keine Umschreibungen verwenden.

Die einfachste Lösung wäre, Ihren “pretty.php”-Code zu Ihrer header.php-Datei in Ihrer WordPress-Vorlage hinzuzufügen. Diese wird bei jeder Anfrage an das Frontend der Website geladen. Wenn Sie den Code nur auf einer bestimmten Seite laden möchten, prüfen Sie einfach mit is_page, auf welcher Seite Sie sich befinden.

zum Beispiel in Ihrer header.php:

if(is_page("groups")){
  if(checkIfUserByUsername($_GET['pretty']))
  {
    // the rest of your code
  }
}

Wenn Sie ein WordPress-Plugin schreiben möchten, müssen Sie nur “add_action” in Ihrem Plugin verwenden:

add_action('wp_head', 'function_containing_your_code');

Auch dies wird auf jeder Seite geladen, also überprüfen Sie einfach, ob Sie sich auf der Seite befinden, auf der Sie Ihren Code laden möchten.

https://codex.wordpress.org/Plugin_API/Action_Reference/wp_head
https://developer.wordpress.org/reference/functions/is_page/

Außerdem können Sie Ihre .htaccess-Datei genauso bearbeiten, wie Sie jede Datei bearbeiten können, für die Ihr Benutzer die Berechtigung zum Bearbeiten hat. Angenommen, Sie betreiben einen Apache-Server, muss Ihre .htaccess-Datei über Berechtigungen verfügen, mit denen die Datei bearbeitet werden kann, und Sie können die Datei mit PHP bearbeiten. zum Beispiel:

$file = fopen("/path/to/.htaccess", "a+");
fwrite($f, "RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA]");
fclose($f);

Viele Leute würden sagen, dass es ein Sicherheitsrisiko darstellt, wenn PHP in Ihre .htaccess-Datei schreibt. Ich würde sagen, dass das unter bestimmten Umständen zutrifft, aber sicherlich nicht immer. Machen Sie sich mit den Berechtigungen vertraut, bevor Sie PHP erlauben, in Ihre .htaccess-Datei zu schreiben.

  • Ich habe die .htaccess-Umschreibung zum Laufen gebracht, aber sie gilt nur für meine Hauptwebsite, nicht für alle Websites im Netzwerk.

    – Dustin Snider

    29. September 2017 um 3:14 Uhr

  • In diese Richtung ging es auch bei mir. Ich würde sagen, dass WordPress Schreibzugriff auf hat .htaccess und das Anwenden von Änderungen in der Produktion ist schlechte Praxis. Ein einziger fehlerhafter Schreibvorgang würde das gesamte Site-Netzwerk lahmlegen. Abhängig von der Serverkonfiguration und der Verwendung von Plug-ins von Drittanbietern ist die Bearbeitung der .htaccess möglicherweise nicht wünschenswert. B. serverseitiges und clientseitiges Caching, wodurch verhindert wird, dass neue Regeln angewendet werden. Dies kann sogar die Reaktionsfähigkeit verschlechtern, da viele Umschreibungsregeln für jede Anforderung verarbeitet werden müssen.

    – Wird B.

    29. September 2017 um 13:19 Uhr

  • Okay, wenn ich die Rewrite-Regel RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 verwende [QSA] Wie bringe ich es dazu, dass es für alle Multisite-Sites funktioniert, nicht nur für die Hauptsite? Fangen wir hier an.

    – Dustin Snider

    29. September 2017 um 16:03 Uhr

  • Ich bin gerade fast ein Jahr später auf diesen Beitrag zurückgekommen, nachdem ich ihn vergessen hatte, und dies war die beste Antwort, die direkt in die 404-Seite integriert wurde.

    – Dustin Snider

    22. August 2018 um 19:22 Uhr

Benutzeravatar von cptnk
cptnk

Zusätzlich zur Antwort von John Gile bereinigen Sie bitte die Get-Parameter. Sie können sich über einige Desinfektionsoptionen informieren hier

In Ihrem Fragenkontext so etwas wie $username = sanitize_text_field( $_GET['pretty'] ); Sollte ausreichen. Aber schauen Sie sich bitte genauer an, was desinfiziert werden muss.

In Bezug auf Ihre ursprüngliche Frage scheint der erste von John vorgeschlagene Ansatz der bessere zu sein.

Betrachten Sie den Moment, in dem zwei separate Anfragen dieselbe URL mit demselben Benutzernamen anfordern. Da das Lesen/Schreiben von Dateien ein blockierender Stream ist, muss eine der Anfragen warten, bis der Stream geschlossen wird, und die Website wird nicht gerendert, bis dies geschieht.

Wenn Sie dies mit einem zusätzlichen Stream oder was auch immer umgehen, riskieren Sie doppelte Einträge oder schlimmer noch eine beschädigte Datei, die zu Serverfehlern führen kann.

Bearbeiten

Ich bin mir nicht ganz sicher, was Sie mit dem Einschließen erreichen wollen include('USERNAME.php') erstellen Sie eine dedizierte PHP-Datei für jeden Benutzer, der sich für Ihr “Multi-Site-Netzwerk” anmeldet? Wenn das der Fall ist, denke ich, dass Sie bei der Planung falsche Entscheidungen getroffen haben.

Wenn Sie das Verhalten abhängig von externen Ressourcen teilen, steuern oder ändern möchten, würden Sie normalerweise Daten in der abrufen JSON Datei Format.

Nun, wenn ich an deiner Stelle wäre, würde ich eine erstellen SICH AUSRUHEN Webdienst, der den JSON in Abhängigkeit vom Benutzernamen-Get-Parameter zurückgibt und die Ausgabe in Abhängigkeit von den eingehenden Daten steuert.

Das Erstellen einer API ist ziemlich komplex und abhängig von Ihren Anforderungen würden Sie das am besten geeignete Tool verwenden. Ich persönlich habe gerne mit gearbeitet Agilität für ziemlich komplexe Dinge und Lumen für Kleinigkeiten. Sie können dies auch selbst erstellen, wenn Sie dies wünschen.

Nach dem Erstellen der API können Sie dann ganz einfach das JSON mit erhalten file_get_contents() wie hier beschrieben oder verwenden Sie ein beliebiges Rest-Tool, das Sie für PHP finden können.

1402830cookie-check.htaccess mit WordPress-Plugin umschreiben

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

Privacy policy