я запутался в 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: // мой домен имя то же самое.
Спасибо, Спасибо за помощь
Три правила перезаписи имеют идентичное регулярное выражение, поэтому будет выполняться только первое из них. Я бы посоветовал вам использовать директивы 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 для полноты.