Перезапись 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 will rewrite to

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

, как я могу сделать это конкретным

ps: // мой домен имя то же самое.

Спасибо, Спасибо за помощь

0
задан 1 March 2016 в 12:33
1 ответ

Три правила перезаписи имеют идентичное регулярное выражение, поэтому будет выполняться только первое из них. Я бы посоветовал вам использовать директивы location и try_files вместо , если и перепишут .

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;
    }
}

См. this для списка директивы nginx и их документация.

EDIT: добавлена ​​директива index в оба примера, location = в первый пример и $ uri / в каждый из try_files в обоих примерах. try_files добавлен в расположение PHP для полноты.

1
ответ дан 4 December 2019 в 16:40

Теги

Похожие вопросы