>백엔드 개발 >PHP 튜토리얼 >Nginx를 만날 때 CodeIgniter가 보고한 404 오류에 대한 솔루션

Nginx를 만날 때 CodeIgniter가 보고한 404 오류에 대한 솔루션

PHP中文网
PHP中文网원래의
2016-07-29 09:12:191102검색

CodeIgniter는 원래 Apache용으로 설계되었으며 Apache는 pathinfo에 대한 더 나은 지원을 제공하므로 모든 것이 매우 좋습니다. 그런데 작성한 코드를 nginx에 넣으면 어이가 없을 수도 있습니다. 아마도 CodeIgniter의 welcom을 제외하면 다른 모든 것이 404 오류였을 것입니다. 그리고 CodeIgniter의 공식 문서에는 Nginx의 구성에 대해 아무 것도 언급되어 있지 않다는 사실에 놀랐습니다. 그리고 당신은 Baidu”CodeIgniter 엔진스 404"이고 기사더미를 검색할 수 있습니다. 이상한 점은 거의 모든 문서의 구성 방법이 다른 것 같습니다. 잘 했다면 아마도 저처럼 며칠 밤 동안 구성을 할 수 없을 것입니다. (본 글의 서버 환경 : CentOS, nginx-1.4.7, PHP-5.4.24, CodeIgniter3.0.2 - 최신 버전)

404 에러가 발생하는 이유

이유 기본 Nginx는 pathinfo 형식을 지원하지 않습니다. 브라우저에 http:xxx.xxx.comindex.phppageshome을 입력하면 Nginx는 index.php 디렉토리 아래의 페이지 폴더에 있는 홈에 액세스하려고 한다고 생각합니다. 404를 보고합니다 오류를 찾을 수 없습니다.

해결책

해결책은 분명히 서버의 리디렉션 규칙을 수정하는 것입니다. 하나는 nginx 설치 디렉터리에서 nginx.conf 파일을 변경하는 것입니다. 가상 호스트의 경우 nginx 설치 디렉터리의 vhosts로 이동하여 해당 *.conf를 찾아 변경하면 됩니다. 또 다른 아이디어는 CI 디렉터리의 .htaccess 파일을 수정하는 것입니다. http://blog.csdn.net/freshlover/article/details/8977111을 참조하세요.
이 문서가 첫 번째 아이디어입니다. 수정하기 전에 원본 conf 파일을 살펴보겠습니다.

{
       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: 개인 정보 보호를 위해 server_name을 내 server_name에 해당하는 1.abc.com으로 변경했습니다.
아래 수정 방법 소개: conf를 수정하기 전에 conf와 cp의 백업 복사본을 conf.back으로 만드는 것을 잊지 마십시오.
수정 방법은 다음과 같습니다.
1. php 지원 경로 정보 수정
conf를 수정하기 전, php의 php.ini 파일을 찾습니다(php 설치 디렉터리의 etc 디렉터리나 lib 폴더, 자체 구성 참조), 검색: cgi.fix_pathinfo
주석을 해제하고 1로 설정: cgi.fix_pathinfo=1

2. conf를 수정하기 전에 명확해야 할 문제가 있습니다. 그것이 CI의 루트 디렉토리입니까? 그렇다면 다음과 같이 수정하십시오.
다음을 추가하십시오.
위치 앞에 단락을 추가하십시오. ~ .php$:

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

즉, 액세스하려는 파일이 브라우저에 없으면 자동으로 웹 루트 디렉터리의 index.php로 라우팅되어 액세스됩니다.
물론 위 단락을 다음으로 대체할 수도 있습니다.

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

전체 구성은 다음과 같습니다.

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

참고: 위의 try_files는 rewrite를 완전히 대체할 수 있습니다. 링크
를 참조하세요. 이 리디렉션을 추가하는 것 외에도 conf에 이상한 것을 추가할 필요가 없습니다.
그런 다음 CI 구성 파일에서 다음 세 가지 매개변수를 확인하십시오.

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

이 세 가지 매개변수는 중요합니다. 첫 번째 매개변수는 웹 루트 디렉토리에 해당하는 도메인 이름이 ","이어야 합니다. no 기본값은 'index.php'입니다.
위 설정 후에는 URL 주소에 index.php를 쓸 필요가 없습니다. 이제 A 백엔드가 앱과 웹을 지원하고 때로는 다른 프레임워크를 사용하는 것이 불가피하다면 내 CI의 루트 디렉터리가 웹의 루트 디렉터리가 아닌 경우에는 보기 좋지 않을 것입니다. public_html 아래의 폴더에서 다음과 같이 conf의 try_files 문의 /index.php 경로를 /xxx/index.php로 변경하면 됩니다.

그런 다음 config.php에서 CI를 변경합니다.

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

$config['base_url'] = 'http://1.abc.com/';11
을 사용해도 됩니다. 라우팅이 올바르면 문제가 없습니다. 하지만 안전을 위해 base_url을 비교해야 합니다. 그렇다면 url에 index.php를 포함하지 마세요. 둘의 차이점은 base_url()과 같은 CI 함수를 사용할 때 얻은 값이 첨부된다는 점도 반영됩니다.

참조 링크가 더 안정적입니다.

http://stackoverflow.com/questions/8182868/nginx-configuration-avoid-codeigniter-rewrite-rules
$config['base_url'] = 'http://app.sod90.com/xxx/';11
CI의 여러 디렉터리: http:/ /blog.sina.com.cn/s/blog_6ec2ae900101kbx9.html

추가 설명은 일반적으로 conf의 다음 세 문장이 핵심입니다.



하지만 저는 내 conf의 다음 문장:

   fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;123123

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.