2017-10-17 9 views
18

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

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

Ich möchte meinen CI-Pfad wie example.com/hotel/ci/register ausführen, ich denke, wir können es mit einigen Rewrite-Regel tun, so dass meine URL wie example.com/hotel/ci/register aussehen würde. Ich habe htaccess für WordPress hinzugefügt, die mich hier umleiten example.com/hotel/ci/register. Es zeigt mir 404 error von CI. Es bedeutet, dass ich jetzt in CI bin. Jetzt habe ich folgende Dinge in routes.php Datei gemacht.

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

Nun ist diese URL example.com/hotel/ci/register funktioniert, aber das ist nicht richtig, es beim nächsten Mal mehr Controller sein wird, dann wird es nicht funktionieren.

Hinweis: Ich kann hotel Ordner nicht erstellen, weil Hotel eine Seite im WordPress ist. Wenn ich hotel Ordner erstellen, wird WordPress URL example.com/hotel/ nicht funktionieren. Es wird WordPress-Seite auf den Ordner hotel umleiten. Also muss ich es tun, ohne hotel Ordner zu erstellen. Hinweis example.com = myurl.com.

Ich muss eine andere gute Lösung finden.Ein Rat oder eine Anleitung würde sehr geschätzt werden?

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 folgende 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> 
+0

Post 'ci' Ordner' .htaccess' –

+0

haben Sie die 'base_url' in der' config.php' Datei geändert, um den neuen URL-Pfad übereinstimmen? – am05mhz

+0

Dies ist die URL http://example.com/ci/ –

Antwort

5

Interessantes Problem! Ich richtete einen Docker-Container mit einer neuen Installation von Wordpress und Codeigniter ein, ich erstellte eine hotel-Seite in WP und eine Register-Controller und Ansicht in CI und wurde getestet. Ich habe viel zu lange damit verbracht, aber ich habe eine Antwort gefunden.

Zuerst Ihre Wordpress .htaccess. Wie @tobiv in einem Kommentar darauf hingewiesen hat, solltest du nichts zwischen den BEGIN/END WordPress Kommentaren hinzufügen, da es durch ein WP-Update beschädigt werden könnte. Ihre Umleitung hat vor die Standard-WP Regeln obwohl kommen, so fügen Sie es an den 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 dupliziert werden, die chaotisch scheint aber Sie tun müssen sie, wie Ihre neue Die Regel muss zuerst gehen, damit die Anfrage bearbeitet wird, bevor die WP-Regeln dies tun.

Sie müssen die Codeigniter .htaccess Datei nicht ändern, die Standard ist alles was Sie brauchen. Es sollte in der Wurzel Ihrer Codeigniter Installation sein, ci/.htaccess:

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

An diesem Punkt https://example.com/hotel/ci/register die Codeigniter 404 Seite zeigen wird. Wenn Sie (siehe config/config.php) aktiviert haben Protokollierung und Sie sehen das Logfile, werden Sie sehen, warum:

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

Und hier ist die Wurzel des ganzen Problems. Da die anfängliche Weiterleitung eine interne Weiterleitung ist (bedeutet, dass sich die im Browser angezeigte URL nicht ändert), empfängt der zu empfangende URI-Codeigner die in der Adressleiste des Browsers noch angezeigte - hotel/ci/register.Codeigniter wird versuchen, eine Anfrage wie das in 2 Möglichkeiten zu behandeln: eine passende Route für einen Controller in application/config/routes.php

  • Oder application/controllers/Hotel.php, genannt mit einer Methode namens ci aussehen

    • Blick;

    In unserem Fall gibt es keine Hotel Controller und kein Weg zu beschreiben, wie eine solche Anfrage zu handhaben, so boom, 404.

    Eine einfache Lösung ist es, eine Route zu erstellen, um diese Anforderung zu verarbeiten:

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

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

    Hinweise:

    • Ihre Standardroute zu register Einstellung ($route['default_controller'] = 'register';) bedeutet, dass https://example.com/ci/ wird Register auch zeigen. Ich bin mir nicht sicher, ob du das willst? Sie könnten auf SEO-Probleme mit Duplicate-Content stoßen, wenn diese URL dasselbe wie https://example.com/hotel/ci/register anzeigt. Vielleicht möchten Sie also etwas anderes oder ein 404 dort.

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

    • CI base_url ist nicht relevant für dieses Problem, obwohl offensichtlich sollte eingestellt werden. Abhängig davon, wie Sie Ihre Links sein wollen, denke ich, entweder oder http://example.com/hotel/ci/ wäre richtig.

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

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

      Die vorhandenen Standardbedingungen bereits überspringen Dateien und Verzeichnisse, die auf der Festplatte vorhanden ist. Das ist, was die !-f und !-d Bedingungen bedeuten - „wenn die angeforderte Muster nicht eine Datei oder ein Verzeichnis auf der Festplatte übereinstimmen, dann tut die Umleitung“.

      Wenn Sie eine robots.txt Datei auf einem Datenträger (in Ihrem ci/ dir), und jemand fragt https://example.com/ci/robots.txt, die !-f Bedingung fehl, und die Rewrite übersprungen - Was bedeutet die Anforderung ohne Umschreiben gehandhabt wird und robots.txt erfolgreich zurückgegeben. Das Gleiche gilt für index.php. Wenn Sie ein Verzeichnis namens ci/resources, und jemand fragt https://example.com/ci/resources, die !-d Bedingung fehl, wird die Umleitung übersprungen, und die Anforderung erfolgreich.

      Ich bin über Ihren resources Teil nicht sicher, aber vielleicht können Sie diese Bedingung vollständig entfernen.

    • Wenn Sie keine schönen Codeigniter URLs (ich meine andere als https://example.com/hotel/ci/register, diese Änderung wird es nicht beeinflussen), und es stellt sich heraus, dass Sie nicht die oben genannten zusätzlichen Bedingung brauchen, können Sie loswerden CI .htaccess vollständig um Dinge zu vereinfachen.Um das zu tun, ändern Sie einfach die Wordpress RewriteRule auf die nicht recht Version:

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

      und löschen Sie Ihre CI .htacces.

  • +0

    Sie haben es mit einem besseren Weg erklärt. Ich habe gerade Routing verwendet. $ route ['hotel/ci/register'] = 'registrieren'; Ich habe index.php aus CI entfernt. Ich habe gerade Routing verwendet. Das Hauptproblem in meiner Frage war die codeigniter URI Routing- und Rewrite-Regel in htaccess. Es ist jetzt gelöst. Vielen Dank –

    2

    Ich glaube, Sie auf dem richtigen Weg sind, versuchen Sie dies:

    # 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 
    

    behalten Sie Ihre CI htaccess wie es 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 ist Ihre CI

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

    Ich habe dasselbe gemacht, aber es zeigt mir 404 von wordpress –

    +0

    Ich habe das Register von $ route ['404_override'] = 'register' entfernt; –

    +0

    hmmm .. das ist leise seltsam, ich sehe kein Problem mit Ihrem htaccess neben dem oben genannten Punkt, und ich habe keine Testumgebung für jetzt, so kann ich es nicht testen – am05mhz

    1

    Verwenden .htaccess [P] Flag statt config.php zu Ihrem neuen URL-Modell entsprechen.

    Stellen Sie sicher, dass die Ersatzzeichenfolge (Ziel) mit http:// beginnt. 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. Leere Zeichenfolge wird ausreichen.

    $config['base_url'] = ''; 
    

    Hoffe, dass hilft.

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

    +0

    Zeigt mir folgenden Fehler: Interner Serverfehler Der Server hat einen internen Fehler oder Fehlkonfiguration festgestellt und konnte Ihre Anfrage nicht abschließen. Wenden Sie sich an den Serveradministrator unter [email protected], um ihn über den Zeitpunkt des Auftretens dieses Fehlers und die Aktionen zu informieren, die Sie kurz vor diesem Fehler ausgeführt haben. Weitere Informationen zu diesem Fehler sind möglicherweise im Fehlerprotokoll des Servers verfügbar. Darüber hinaus wurde ein 500 Internal Server Error Fehler beim Versuch, ein ErrorDocument verwenden, um die Anforderung zu behandeln. –

    +0

    Ich benutze https: // –

    +0

    Ich sehe ... Es ist ein "SSL-Proxy" -Ausgabe. Fügen Sie ** SSLProxyEngine on ** in Ihrem '' hinzu, das behoben wird. Wenn nicht, füge diese Direktiven hinzu (besuche den Link): https://stackoverflow.com/a/22069646/959060 –

    2

    Ich Sache nicht, dies wird die große Antwort auf Ihre Frage, aber wenn ich vor dem gleichen Problem i routes siehe den Beispielcode verwenden.

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

    was wird der obige Code tun (:any) jedes Wort in der ersten uri und nach, dass Sie eine beliebige URL definiert sind, können Sie wollen i ci/register definiert Sie auch, dass, wie dies tun können.

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

    dies funktioniert, wenn Sie URL wie folgt treffen.

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

    it will hit your controller function. you need to echo something and it will show in your browser.

    können Sie auch definiert das Hotel Wort in Ihrer Basis-URL als @ am05mhz zeigt in seiner Antwort, aber ich weiß, was nicht das eine gute Idee ist, weil in Zukunft können Sie 2 in Ihrer URL mehr Worte.

    Hinweis: das obige Code Beispiel nur, wenn Ihre .htaccess Zugang von router geben, wie Sie in Ihrer Frage zeigen die .htaccess Arbeit für Sie. Für vollständige Kenntnis des Routers bitte die Dokumentation von codeigniter URI routing

    +0

    Ich habe deine $ route ['(: any)/ci/register'] = "register" hinzugefügt; Wenn ich $ route entfernen ['404_override'] = 'register'; nach $ route ['404_override'] = ''; dann zeigt es 404 von CI. Es bedeutet Ihre $ route ['(: any)/ci/register'] = "registrieren"; und meine $ route ['default_controller'] = 'register'; Sind beide identisch, wird 404 angezeigt, wenn ich $ route ['404_override'] = 'register' nicht zuweiße; –

    +0

    in Ihrem Code, wenn index.php undefiniert die Root-URL dann zeigt es 404 und Sie setzen Ihren Controller als 404-Fehler. Ja es ist in deinem Router aber es fängt nur den Fehler Router. Wenn Sie dies erreichen wollen, müssen Sie codeigniter in diesen Pfad 'public_html -> hotel -> and_here_your_codeigniter' setzen, dann wird es funktionieren, sonst können Sie das nicht tun. Ich bin nicht sicher über Ihre '. Htaccess ', wenn es geben, auf Ihren Controller zugreifen dann funktioniert der oben genannte Router 100% für Sie. –

    +0

    Wenn Sie codeigniter in Ihren öffentlichen html-Ordner stellen, funktioniert auch der obige Router für Sie. –