PHP項目在Nginx站點二級目錄時的偽靜態規則
08-20
PHP項目在Nginx站點二級目錄時的偽靜態規則
推薦閱讀:
最近在伺服器處理項目時,想把多個項目放在伺服器的根目錄下面,通過根目錄的二級目錄來訪問相對應的項目,主要是為了方面在各個項目裡面用不同的SVN來控制各個項目。
但是把項目部署到伺服器上了後卻出現了路由找不到,返回404的問題,根目錄下的基礎文件phpinfo可以正常訪問,項目裡面Publicimage目錄下面的圖片也可以訪問到,說明是在伺服器部署項目時偽靜態失效了,因為windows是在Apache下開發的,nginx下.htaccess文件不生效,當時只寫了一級目錄下訪問的偽靜態規則。
- server {
- listen 80;
- server_name test.test.com;
- root /usr/share/nginx/html;
- index index.php index.html;
- location / {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^(.*)$ /index.php?s=$1 last;
- }
- }
- }
後來在網上查找到二級目錄需要在location後面添加二級目錄名,並且在rewrite規則裡面把路由的正則改寫,加上二級目錄的規則後
- server {
- listen 80;
- server_name test.test.com;
- root /usr/share/nginx/html;
- index index.php index.html;
- location / {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^(.*)$ /index.php?s=$1 last;
- }
- }
- location /projectOne/ {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^projectOne/(.*)$ /projectOne/index.php?s=$1 last;
- }
- }
- }
但是這樣配置後訪問還是失敗,需要使用index.php?m=index&c=index&a=index的路由方式來訪問當前控制器,偽靜態規則沒有生效。後來又思考了下,不生效的原因可能是在rewrite規則裡面正則表達式不能識別「/」,後來將正則改了點,另外的一個項目使用的是thinkphp5的框架,入口在三級目錄的public下面,將改寫的規則放上去後,把thinkphp的路由規則選成URL_MODEL => 1, 後兩個項目都可以在根目錄下使用二級目錄來分別控制了。
- server {
- listen 80;
- server_name test.test.com;
- root /usr/share/nginx/html;
- index index.php index.html;
- location / {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^(.*)$ /index.php?s=$1 last;
- }
- }
- location /projectOne/ {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^/projectOne/(.*)$ /projectOne/index.php?s=$1 last;
- }
- }
- location /projectTwo/public/ {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^/projectTwo/public/(.*)$ /projectTwo/public/index.php?s=$1 last;
- }
- }
- }
第一個項目
第二個項目
推薦閱讀: