我对 nginx 重写感到困惑。如果可以的话请帮助我。谢谢
配置文件
#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://我的域名始终是一样的。
谢谢你,谢谢你的帮助
答案1
这三个重写规则具有相同的正则表达式,因此只有第一个会被执行。我建议您使用location
andtry_files
指令,而不是if
and 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/
每个示例添加了指令。添加到 PHP 位置以确保完整性。try_files
try_files