나는 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 도메인 이름은 완전히 같습니다.
고마워, 도와 줘서 고마워
답변
세 가지 다시 쓰기 규칙은 동일한 정규식을 가지므로 첫 번째 규칙 만 실행됩니다. 난 당신이 사용하는 것이 좋습니다 것입니다 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 =
제 1 실시 예에와 $uri/
의 각각에 try_files
두 예이다. try_files
완전성을 위해 PHP 위치에 추가 되었습니다.