小計 -- nginx 中的 $request_uri 和 laravel 中的REQUEST_URI之間的關係
最近,開發有一個大的Laravel專案,之前是使用路徑來區分不同的API介面的,再在想改成用不同的域名。想要把之前的區分不同API的路徑在url中去掉,因為已經使用不同的域名來區分了。這個在nginx上,要怎麼配置呢?
具體需求說明:
之前訪問不同的API介面是用url路徑區分的:
現在要改成用不同的域名區分:
需求是在同一個站點的nginx上更改,如何實現把url中的路徑資訊給去掉,也就是訪問http://api1.xxx.com/login 會自動訪問http://api1.xxx.com/api1/login
具體實現方法
我們知道,nginx中的laravel最主要的配置如下:
location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
如何根據不同的域名,更新index.php?後面的$query_string呢?其實關鍵點在fastcgi.conf檔案中,
[email protected]:/etc/nginx# vi fastcgi.conf fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name; fastcgi_paramQUERY_STRING$query_string; fastcgi_paramREQUEST_METHOD$request_method; fastcgi_paramCONTENT_TYPE$content_type; fastcgi_paramCONTENT_LENGTH$content_length; fastcgi_paramSCRIPT_NAME$fastcgi_script_name; fastcgi_paramREQUEST_URI$request_uri; fastcgi_paramDOCUMENT_URI$document_uri; fastcgi_paramDOCUMENT_ROOT$document_root; fastcgi_paramSERVER_PROTOCOL$server_protocol; fastcgi_paramREQUEST_SCHEME$scheme; fastcgi_paramHTTPS$https if_not_empty; fastcgi_paramGATEWAY_INTERFACECGI/1.1; fastcgi_paramSERVER_SOFTWAREnginx/$nginx_version; fastcgi_paramREMOTE_ADDR$remote_addr; fastcgi_paramREMOTE_PORT$remote_port; fastcgi_paramSERVER_ADDR$server_addr; fastcgi_paramSERVER_PORT$server_port; fastcgi_paramSERVER_NAME$server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_paramREDIRECT_STATUS200;
laravel 會讀取REQUEST_URI變數,來進行route。而REQUEST_RUI在fastcgi.conf配置中,就是nginx 的$request_uri,包含請求引數的原始URI,不包含主機名。合理的根據主機名,更改REQUEST_URI變數,就可以實現上面的需求。
根據上面的解釋,上面的有關laravel的nginx配置更改為:
### 增加相應的api域名 server_name xxx.com api1.xxx.com api2.xxx.com api3.xxx.com location / { try_files $uri $uri/ /index.php?$query_string; } ### 把$request_uri 賦值給 $request_url set $request_url $request_uri; ### 如果訪問域名匹配 api1.xxx.com,把 $request_url 更新為 /api1/$request_uri if ($host ~ api1.xxx.com) { set $request_url /api1$request_uri; } ### 如果訪問域名匹配 api2.xxx.com if ($host ~ api2.xxx.com) { set $request_url /api2$request_uri; } ### 如果訪問域名匹配 api1.xxx.com if ($host ~ api3.xxx.com) { set $request_url /api3$request_uri; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ### 把傳給laravel 的REQUEST_URI 賦值為我們上面根據域名更新的的$request_url fastcgi_paramREQUEST_URI $request_url; }
OK,相關設定完成!