[server] Nginx 특정 재 작성 [닫힘]

나는 nginx rewrite에서 혼란스러워합니다. 할 수 있으면 도와주세요 .. 감사합니다

xxxx.conf

#vhost-xxxxx
server {

        listen       80;
        server_name  xxxx.xxxx.com;
        root   /var/www/html;
        index index.php index.html index.htm;
        charset utf-8;
       access_log  logs/xxxxxx.access.log;

}

#rewrite
 if (!-e $request_filename)
{

       rewrite ^(.+)$ /cn/index.php?q=$1 last;
}

location ~ \.php$ {

        root           /var/www/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;

}

}

안녕 모두, 내 nginx가 / var / www / html 아래의 / var / www / html 루트 폴더를 가리키고 있습니다. 3 개의 폴더 cn, my, en이 있습니다

따라서 xxxxx.xxxxx.com/cn/으로 진행하면 아무런 문제가 없습니다.

그러나 xxxxx.xxxxx.com/en 또는 / my로 처리하면 403 Forbidden이 표시됩니다.

나는이 설정을 수행하기 전에 시도

#rewrite
 if (!-e $request_filename)
{

       rewrite ^(.+)$ /cn/index.php?q=$1 last;
       rewrite ^(.+)$ /en/index.php?q=$1 last;
       rewrite ^(.+)$ /my/index.php?q=$1 last;
}

그러나 cn의 경우에만 작동하고 다른 장치는 금지됩니다.

사용자가 / en에 갔다가 다시 쓰면 어떻게 만들 수 있습니까

rewrite ^(.+)$ /en/index.php?q=$1 last;

또는 내 사용자가 / my로 다시갑니다.

rewrite ^(.+)$ /my/index.php?q=$1 last;

내가 구체적으로 만들 수있는 방법

ps : // my 도메인 이름은 완전히 같습니다.

고마워, 도와 줘서 고마워



답변

세 가지 다시 쓰기 규칙은 동일한 정규식을 가지므로 첫 번째 규칙 만 실행됩니다. 난 당신이 사용하는 것이 좋습니다 것입니다 locationtry_files대신 지시 if하고 rewrite.

server {
    listen       80;
    server_name  example.com;
    charset utf-8;
    access_log  logs/xxxxxx.access.log;

    root   /var/www/html;

    index index.php;
    location = / { return 301 /cn/; }

    location / {
        try_files $uri $uri/ /cn/index.php?q=$uri;
    }
    location /en {
        try_files $uri $uri/ /en/index.php?q=$uri;
    }
    location /my {
        try_files $uri $uri/ /my/index.php?q=$uri;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
}

참고 : PHP 위치 블록에서 일부 지시문을 제거하고 순서를 변경했습니다.

위의 내용을 정규식으로 결합하려는 경우 (비효율적이지만 확장 가능할 수 있음) :

server {
    listen       80;
    server_name  example.com;
    charset utf-8;
    access_log  logs/xxxxxx.access.log;

    root   /var/www/html;

    index index.php;
    location = / { return 301 /cn/; }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
    location ~ "^(?<lang>/\w{2})/" {
        try_files $uri $uri/ $lang/index.php?q=$uri;
    }
}

지시문 목록 과 설명서 는 내용을 참조하십시오 nginx.

편집 : 추가 된 index두 예에 지시자를 location =제 1 실시 예에와 $uri/의 각각에 try_files두 예이다. try_files완전성을 위해 PHP 위치에 추가 되었습니다.


답변