Nginx

Nginx 特定重寫

  • March 1, 2016

我對 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;

或者我的使用者去了 /my will rewrite to

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

我怎樣才能使它具體

ps://我的域名一路都是一樣的。

謝謝你,謝謝幫助

三個重寫規則具有相同的正則表達式,因此只有第一個會被執行。我建議您使用locationandtry_files指令而不是ifand 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了指令。為了完整起見,添加到 PHP 位置。location =``$uri/``try_files``try_files

引用自:https://serverfault.com/questions/760658