WordPress- und CI-Umschreibungsregel in htaccess

Lesezeit: 10 Minuten

Benutzeravatar von Pawan Thakur
Pawan Thakur

Ich habe WordPress in example.com installiert. Ich habe auch CodeIgniter installiert ci Ordner hier example.com/ci/, ci ist der Ordnername, register der Name des Controllers und die Arbeits-URL von CI ist example.com/ci/register . Meine Basis-URL beginnt mit https:// .

Jetzt habe ich eine WordPress-URL example.com/hotel, hotel ist die Seite, die ich im WordPress-Admin erstellt habe, es funktioniert gut.

Ich möchte meinen CI-Pfad gerne ausführen example.com/hotel/ci/registerich denke, wir können es mit einer Rewrite-Regel machen, so dass meine URL so aussehen würde example.com/hotel/ci/register. Ich habe gegeben hinzugefügt htaccess für WordPress, das mich hierher umleitet example.com/hotel/ci/register. Es zeigt mir 404 error von CI. Das bedeutet, dass ich jetzt in CI bin. Jetzt habe ich folgende Dinge in routes.php Datei.

$route['default_controller'] = 'register';
$route['404_override'] = 'register';

Jetzt diese URL example.com/hotel/ci/register funktioniert, aber das ist nicht der richtige Weg, das nächste Mal wird es mehr Controller geben, dann wird es nicht funktionieren.

Notiz: Ich kann nicht erstellen hotel Ordner, weil Hotel eine Seite in WordPress ist. Wenn ich schaffe hotel Ordner dann die WordPress-URL example.com/hotel/ wird nicht funktionieren. Es leitet die WordPress-Seite auf die um hotel Mappe. Also muss ich es tun, ohne zu erstellen hotel Mappe. Beachten Sie example.com=myurl.com .

Ich muss eine andere gute Lösung finden. Für Ratschläge oder Anleitungen wäre ich sehr dankbar?

Das Folgende ist meine ReWrite-Regel in WordPress htaccess:

# BEGIN WordPress
   <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^/?hotel/ci/register(/.*)?$ /ci/$1 [L]
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
# END WordPress

Und folgendes ist mein CI htaccess:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 
</IfModule>

  • Poste deine ci Mappe .htaccess

    – Xpleria

    27. Oktober 2017 um 12:54 Uhr


  • hast du die geändert base_url in dem config.php Datei an den neuen URL-Pfad anpassen?

    – am05MHz

    2. November 2017 um 8:46 Uhr

  • Dies ist die URL example.com/ci

    – Pawan Thakur

    2. November 2017 um 8:58 Uhr

  • Nur eine Warnung, Sie sollten Ihre benutzerdefinierte Regel außerhalb von setzen #BEGIN und #END WordPress Kommentare, da sie durch ein Update überschrieben werden könnten.

    – tobiv

    3. November 2017 um 9:06 Uhr

  • Ich werde es tun. Danke, dass du es mir gesagt hast

    – Pawan Thakur

    3. November 2017 um 9:12 Uhr

Benutzeravatar von Don't Panic
Keine Panik

Interessantes Problem! Ich habe einen Docker-Container mit einer Neuinstallation von WordPress und Codeigniter eingerichtet, ich habe eine hotel Seite in WP und a Register Controller und Ansicht in CI, und habe Tests bekommen. Ich habe viel zu lange damit verbracht, aber ich habe eine Antwort gefunden.

Zuerst Ihr WordPress .htaccess. Wie @tobiv in einem Kommentar betonte, sollten Sie nichts zwischen den hinzufügen BEGIN/END WordPress kommentieren, da es durch ein WP-Update beschädigt werden könnte. Ihre Weiterleitung muss kommen Vor die Standard-WP-Regeln, also fügen Sie es bei der hinzu oben der Datei:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^hotel/ci/register /ci/register [L]
</IfModule>

# BEGIN WordPress
# ... These are the default, unchnaged WP rules
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

<IfModule mod_rewrite.c> und RewriteEngine On werden dupliziert, was chaotisch erscheint, aber Sie brauchen sie, da Ihre neue Regel zuerst gehen muss, damit sie die Anfrage verarbeitet, bevor die WP-Regeln dies tun.

Sie müssen den Codeigniter nicht modifizieren .htaccess Datei, die Standarddatei ist alles, was Sie brauchen. Es sollte sich im Stammverzeichnis Ihrer Codeigniter-Installation befinden. ci/.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

An dieser Stelle https://example.com/hotel/ci/register zeigt die Codeigniter 404-Seite an. Wenn Sie die Protokollierung aktiviert haben (siehe config/config.php), und Sie sehen sich die Protokolldatei an, Sie werden sehen, warum:

ERROR - 2017-11-14 17:57:20 --> 404 Page Not Found: Hotel/ci

Und hier liegt die Wurzel des ganzen Problems. Da die anfängliche Weiterleitung eine ist intern Umleitung (bedeutet, dass sich die im Browser angezeigte URL nicht ändert), die URI, die Codeigniter zur Verarbeitung erhält, ist diejenige, die immer noch in der Adressleiste des Browsers angezeigt wird – hotel/ci/register. Codeigniter versucht, eine solche Anfrage auf zwei Arten zu bearbeiten:

  • Suchen Sie nach einer passenden Route in application/config/routes.php

  • Oder suchen Sie nach einem Controller mit dem Namen application/controllers/Hotel.phpmit einer Methode namens ci;

In unserem Fall gibt es keine Hotel Controller, und keine Route, um zu beschreiben, wie eine solche Anfrage zu handhaben ist, also Boom, 404.

Eine einfache Lösung besteht darin, eine Route zur Bearbeitung dieser Anfrage zu erstellen:

$route['hotel/ci/register'] = 'register/index';

Und nun https://example.com/hotel/ci/register funktioniert!

Anmerkungen:

  • Festlegen Ihrer Standardroute auf register ($route['default_controller'] = 'register';) bedeutet, dass https://example.com/ci/ zeigt auch registrieren. Ich bin mir nicht sicher ob du das willst? Sie könnten auf SEO-Probleme mit doppeltem Inhalt stoßen, wenn diese URL dasselbe wie anzeigt https://example.com/hotel/ci/registeralso möchten Sie vielleicht etwas anderes oder einen 404 dort.

  • Stellen Sie sicher, dass Sie Ihre entfernen $route['404_override'] = 'register'; Route;

  • KI base_url ist für dieses Problem nicht relevant, sollte aber offensichtlich gesetzt werden. Je nachdem, wie Sie Ihre Links haben möchten, denke ich entweder http://example.com/ci/ oder http://example.com/hotel/ci/ wäre richtig.

  • Ich bin mir nicht ganz sicher, was der Zweck dieser Bedingung in Ihrem CI ist .htaccess ist für:

    RewriteCond $1 !^(index\.php|resources|robots\.txt)
    

    Die vorhandenen Standardbedingungen überspringen bereits Dateien und Verzeichnisse, die auf der Festplatte vorhanden sind. Das ist, was die !-f und !-d Bedingungen bedeuten – “Wenn das angeforderte Muster nicht mit einer Datei oder einem Verzeichnis auf der Festplatte übereinstimmt, führen Sie die Umleitung durch”.

    Wenn Sie eine haben robots.txt Datei auf der Festplatte (in Ihrer ci/ dir), und jemand verlangt https://example.com/ci/robots.txtdas !-f Die Bedingung schlägt fehl, und das Umschreiben wird übersprungen – was bedeutet, dass die Anforderung ohne Umschreiben und verarbeitet wird robots.txt erfolgreich zurückgegeben wird. Das gleiche für index.php. Wenn Sie ein Verzeichnis namens ci/resourcesund jemand verlangt https://example.com/ci/resourcesdas !-d Die Bedingung schlägt fehl, die Umleitung wird übersprungen und die Anfrage ist erfolgreich.

    Bei deinem bin ich mir nicht sicher resources Teil, aber vielleicht können Sie diese Bedingung vollständig entfernen.

  • Wenn Sie keine hübschen Codeigniter-URLs benötigen (ich meine andere als https://example.com/hotel/ci/registerdiese Änderung wirkt sich nicht darauf aus) und es stellt sich heraus, dass Sie diese zusätzliche Bedingung oben nicht benötigen, Sie können das CI loswerden .htaccess alles komplett zu vereinfachen. Ändern Sie dazu einfach die WordPress RewriteRule zur unschönen Version:

    RewriteRule ^hotel/ci/register /ci/index.php/register [L]
    

    Und löschen Sie Ihr CI .htacces.

  • Du hast es besser erklärt. Ich habe nur Routing verwendet. $route[‘hotel/ci/register’] = ‘registrieren’; Ich habe index.php von CI entfernt. Ich habe nur Routing verwendet. Bedeutet, dass Codeigniter-URI-Routing und Rewrite-Regel in htaccess das Hauptproblem in meiner Frage waren. Es ist jetzt gelöst. Vielen Dank

    – Pawan Thakur

    15. November 2017 um 4:54 Uhr

Ich denke, Sie sind auf dem richtigen Weg, versuchen Sie Folgendes:

# BEGIN WordPress
   <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^/hotel/ci(/.*)?$ /ci/$1 [L]  # remove the register part 
                                              # so that it would be handled by CI
                                              # also remove the "?" in front of hotel
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
# END WordPress

behalte deinen CI htaccess wie er ist:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 
</IfModule>

Der letzte Teil passt zu Ihrem CI config.php zu Ihrem neuen URL-Modell

$config['base_url'] = "http://example.com/hotel/ci/";

  • Ich habe das Register von $route entfernt[‘404_override’] = ‘registrieren’;

    – Pawan Thakur

    2. November 2017 um 9:05 Uhr

  • hmmm .. das ist ziemlich seltsam, ich sehe kein Problem mit Ihrem htaccess neben dem obigen Punkt, und ich habe im Moment keine Testumgebung, also kann ich es nicht testen

    – am05MHz

    2. November 2017 um 9:23 Uhr

Benutzeravatar von Yaseen Ahmad
Yaseen Ahmad

Ich glaube nicht, dass dies die großartige Antwort auf Ihre Frage sein wird, aber wenn ich vor dem gleichen Problem stehe, werde ich es verwenden routes siehe Beispielcode.

$route['(:any)/ci/register']  = "register";

Was wird der obige Code tun (:any) bedeutet ein beliebiges Wort in der ersten URI und danach können Sie eine beliebige URL definieren, die Sie definieren möchten ci/register das kannst du auch so machen.

$route['(:any)/register']  = "here_you_can_add_your_controller/function";

Dies funktioniert, wenn die URL wie folgt aufgerufen wird.

http://www.example.com/any_word_you_want/register

Es wird Ihre Controller-Funktion treffen. du musst echo etwas und es wird in Ihrem Browser angezeigt.

Sie können auch die definieren Hotel Wort in Ihrer Basis-URL, wie @am05mhz in seiner Antwort zeigt, aber ich denke nicht, dass das eine großartige Idee ist, weil Sie in Zukunft möglicherweise 2 weitere Wörter in Ihrer URL haben.

Notiz : Das obige Codebeispiel funktioniert nur, wenn Ihre .htaccess gib den Zugriff auf den Router so wie du in deiner Frage zeigst .htaccess ist Arbeit für dich. Für vollständige Kenntnisse über Router lesen Sie bitte die Dokumentation von Codeigniter-URI-Routing

  • Ich habe deine $route hinzugefügt[‘(:any)/ci/register’] = “registrieren”; Wenn ich $route[‘404_override’] = ‘registrieren’; zu $route[‘404_override’] = ”; dann zeigt es 404 von CI. Es bedeutet Ihre $route[‘(:any)/ci/register’] = “registrieren”; und meine $route[‘default_controller’] = ‘registrieren’; sind beide gleich, wird 404 angezeigt, wenn ich $route nicht zuweise[‘404_override’] = ‘registrieren’;

    – Pawan Thakur

    13. November 2017 um 6:38 Uhr

  • in Ihrem Code, wenn index.php die Stamm-URL undefiniert hat, zeigt sie 404 und Sie stellen Ihren Controller als 404-Fehler ein. ja es ist in deinem router aber es fängt nur den fehler des routers ab. Wenn Sie dies erreichen möchten, müssen Sie Codeigniter in diesen Pfad einfügen public_html --> hotel --> and_here_your_codeigniter dann wird es funktionieren, sonst geht das nicht. ich bin mir bei deinem nicht sicher .htaccess Wenn der Zugriff auf Ihren Controller möglich ist, funktionieren die oben genannten Router zu 100% für Sie.

    – Yaseen Ahmad

    13. November 2017 um 6:47 Uhr


  • wenn du codeigniter in deinen öffentlichen html ordner stellst dann funktionieren auch die obigen router für dich.

    – Yaseen Ahmad

    13. November 2017 um 6:54 Uhr

  • Es tut mir leid, dass ich meinen Codeigniter nicht in diesen Ordner “Hotel” legen kann, da es sich um eine Seite in WordPress handelt. sagst du dasselbe?

    – Pawan Thakur

    13. November 2017 um 7:08 Uhr


  • Sie erstellen einen neuen Ordner in öffentlichem HTML, wenn Sie nur Hotel in URL sehen möchten, wenn Sie WordPress und Codeigineter mischen, dann ist dies nicht möglich

    – Yaseen Ahmad

    13. November 2017 um 7:29 Uhr

htaccess verwenden [P] Flagge statt.

Stellen Sie sicher, dass die Ersatzzeichenfolge (Ziel) mit beginnt http://. Andernfalls wird die Ersatzzeichenfolge als interner Dateipfad behandelt.

Überprüfen Sie den folgenden Code.

# BEGIN WordPress
   <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^/?hotel/ci/(.*)?$ http://example.com/ci/$1 [P]

    # If you want rewrite any URI as long it has */ci/* in it. 
    # Use the following rule instead.
    # RewriteRule ^(.*)/ci/(.*)?$ http://example.com/ci/$1 [P]

    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
# END WordPress

Außerdem müssen Sie die Basis-URL von CI nicht aktualisieren. Eine leere Zeichenfolge reicht aus.

$config['base_url'] = '';

Ich hoffe, das hilft.

Verbindungen:
https://httpd.apache.org/docs/current/rewrite/flags.html#flag_p

1403250cookie-checkWordPress- und CI-Umschreibungsregel in htaccess

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

Privacy policy