Я запутался в перезаписи nginx. пожалуйста, помогите мне, если сможете .. Спасибо
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;
или мой пользователь перешел в / моя перепишу на
rewrite ^(.+)$ /my/index.php?q=$1 last;
как я могу сделать это конкретным
ps: // мое доменное имя полностью совпадает.
Спасибо, спасибо за помощь
Три правила перезаписи имеют идентичное регулярное выражение, поэтому будет выполнено только первое из них. Я бы посоветовал вам использовать location
и try_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 =
к первому примеру, и $uri/
каждому из try_files
в обоих примерах. Добавлено try_files
в расположение PHP для полноты.