Heim >Backend-Entwicklung >PHP-Tutorial >Lösung für den von CodeIgniter gemeldeten 404-Fehler bei der Begegnung mit Nginx

Lösung für den von CodeIgniter gemeldeten 404-Fehler bei der Begegnung mit Nginx

PHP中文网
PHP中文网Original
2016-07-29 09:12:191101Durchsuche

Da CodeIgniter ursprünglich für Apache entwickelt wurde und Apache Pathinfo besser unterstützt, ist alles sehr schön. Aber als Sie den Code, den Sie geschrieben haben, auf Nginx abgelegt haben, waren Sie verblüfft. Vielleicht war bis auf die Begrüßung durch CodeIgniter alles andere ein 404-Fehler. Und ich war überrascht, dass in der offiziellen Dokumentation von CodeIgniter nichts über die Konfiguration auf Nginx gesagt wurde. Und du Baidu“CodeIgniter Nginx 404" und Sie können nach Stapeln von Artikeln suchen. Das Seltsame ist, dass die Konfigurationsmethode für fast jedes Dokument anders zu sein scheint. Wenn Sie es gut gemacht haben, können Sie es möglicherweise mehrere Nächte lang nicht konfigurieren, so wie ich es tue gleich. (Die Serverumgebung dieses Artikels: CentOS, nginx-1.4.7, PHP-5.4.24, CodeIgniter3.0.2 – die neueste Version)

Der Grund für den 404-Fehler

Der Grund Standardmäßig unterstützt Nginx das Pathinfo-Format nicht. Wenn Sie http:xxx.xxx.comindex.phppageshome in Ihren Browser eingeben, geht Nginx davon aus, dass Sie auf das Home im Ordner „pages“ im Verzeichnis „index.php“ zugreifen möchten werde 404 melden Fehler nicht gefunden.

Lösung

Die Lösung besteht definitiv darin, die Umleitungsregeln des Servers zu ändern. Eine davon besteht darin, die Datei nginx.conf im Nginx-Installationsverzeichnis zu ändern Gehen Sie für virtuelle Hosts einfach zu vhosts im Nginx-Installationsverzeichnis und suchen Sie die entsprechende *.conf, die Sie ändern möchten. Eine andere Idee besteht darin, die .htaccess-Datei im CI-Verzeichnis zu ändern, siehe: http://blog.csdn.net/freshlover/article/details/8977111
Dieser Artikel ist die erste Idee. Schauen wir uns vor der Änderung die ursprüngliche Conf-Datei an:

{
       listen 80;
       server_name 1.abc.com 2.abc.com;
        root /a/domains/1.abc.com/public_html;
        index index.html index.htm index.shtml index.php;
        error_page  404               /404.html;
    #Custom rules Start
        #Custom rules End
    location = /500.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass   unix:/dev/shm/php.sock;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        access_log     /a/apps/nginx/logs/1.abc.com.access.log main;
    }
    location ~ /\.ht {
        deny  all;
    }
}1234567891011121314151617181920212223242512345678910111213141516171819202122232425

PS: Aus Datenschutzgründen habe ich den Servernamen in 1.abc.com geändert, was meinem eigenen Servernamen entspricht
Nachfolgend wird die Änderungsmethode vorgestellt: Denken Sie vor dem Ändern von conf daran, eine Sicherungskopie Ihrer conf und cp als conf.back zu erstellen.
Das Folgende ist die Änderungsmethode:
1. Ändern Sie die PHP-Unterstützungspfadinfo.
Suchen Sie vor dem Ändern von conf die php.ini-Datei von PHP (sie befindet sich möglicherweise im Verzeichnis etc des PHP-Installationsverzeichnisses oder im lib-Ordner, siehe eigene Konfiguration), suchen Sie nach: cgi.fix_pathinfo
Geben Sie die Anmerkung frei und setzen Sie sie auf 1: cgi.fix_pathinfo=1

2 Es gibt ein Problem, das vor dem Ändern von conf geklärt werden muss. Das ist das Stammverzeichnis von CI. Ist das Verzeichnis das Stammverzeichnis des Webs? Wenn ja, ändern Sie es wie folgt:
Fügen Sie einfach Folgendes hinzu:
Fügen Sie vor location ~ .php$ einen Absatz hinzu:

    if (!-e $request_filename) {
          rewrite ^.*$ /index.php last;
     }123123

Das heißt, wenn die Datei, auf die Sie zugreifen möchten, in Ihrem Browser nicht vorhanden ist, wird sie für den Zugriff automatisch an index.php im Web-Stammverzeichnis weitergeleitet.
Natürlich kann der obige Absatz auch durch Folgendes ersetzt werden:

   location / {
        try_files $uri $uri/ /index.php;
    }123123

Die vollständige Konfiguration lautet:

server{
    listen 80;
    server_name 1.sod90.com app.sod90.com;
    root /a/domains/1.sod90.com/public_html;
    index index.html index.htm index.shtml index.php;
    error_page  404               /404.html;
    #Custom rules Start
        #Custom rules End
        location = /500.html {
        root   /usr/share/nginx/html;
    }    #location / {
    #    try_files $uri $uri/ /index.php;
    #}
     if (!-e $request_filename) {
          rewrite ^.*$ /city52/index.php last;
     }
    location ~ \.php$ {
        fastcgi_pass   unix:/dev/shm/php.sock;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        access_log     /a/apps/nginx/logs/app.sod90.com.access.log main;
    }
    location ~ /\.ht {
        deny  all;
    }
}123456789101112131415161718192021222324252627282930313233123456789101112131415161718192021222324252627282930313233

Hinweis: Die oben genannten try_files können das Umschreiben vollständig ersetzen. siehe Link
Zusätzlich zum Hinzufügen dieser Umleitung besteht keine Notwendigkeit, der Konfigurationsdatei etwas Seltsames hinzuzufügen.
Überprüfen Sie dann die folgenden drei Parameter in der CI-Konfigurationsdatei:

$config['base_url'] = 'http://1.abc.com/';$config['index_page'] = '';$config['uri_protocol'] = 'REQUEST_URI';123123

Diese drei Parameter sind wichtiger. Der erste ist der Domänenname, der dem Web-Stammverzeichnis entspricht. , nein Der Standardwert ist „index.php“. Nach den oben genannten Einstellungen ist es nicht erforderlich, „index.php“ in die URL-Adresse zu schreiben >Betrachten Sie nun diese Situation, wenn ein Backend App und Web unterstützt und es manchmal unvermeidlich ist, unterschiedliche Frameworks zu verwenden. Es würde nicht gut aussehen, wenn das Stammverzeichnis meines CI nicht das Stammverzeichnis des Webs wäre xxx-Ordner unter public_html müssen Sie nur die Route /index.php in der try_files-Anweisung in conf wie folgt in /xxx/index.php ändern:

und dann CI in config.php. Es ist in Ordnung,

zu schreiben oder:
   location / {
        try_files $uri $uri/ /xxx/index.php;
    }123123

Solange das Routing korrekt ist, wird es aus Sicherheitsgründen kein Problem geben Im Vergleich zu letzterem. Fügen Sie index.php nicht in die URL ein. Der Unterschied zwischen den beiden spiegelt sich auch in der Tatsache wider, dass die Werte, die bei der Verwendung von CI-Funktionen wie base_url() erhalten werden, angehängt werden >
$config['base_url'] = 'http://1.abc.com/';11
Angehängt ist ein Referenzlink:

http://stackoverflow.com/questions/8182868/nginx-configuration-avoid-codeigniter-rewrite-rules

CIs mehrere Verzeichnisse: http: //blog.sina.com.cn/s/blog_6ec2ae900101kbx9.html
$config['base_url'] = 'http://app.sod90.com/xxx/';11

Zusätzliche Erklärung, im Allgemeinen sind die folgenden drei Sätze in der Conf wichtig:


Aber ich verwende nur der folgende Satz in meiner Conf:

   fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;123123
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn