2014-04-29 46 views
0

我們剛從辦公室切換到Apache到nginx。

阿帕奇重寫規則看起來像下面這樣:

RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3&D=$4&E=$5 [L] 
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3&D=$4 [L] 
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3 [L] 
RewriteRule ^([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2 [L] 
RewriteRule ^([^/]*)/$ /main.php?A=$1 [L] 

新Nginx的規則如下:

rewrite ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3&D=$4&E=$5 last; 
rewrite ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /main.php??A=$1&B=$2&C=$3&D=$4 last; 
rewrite ^([^/]*)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3 last; 
rewrite ^([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2 last; 
rewrite ^([^/]*)/$ /main.php?A=$1 last; 

這裏的問題,假設我們在訪問domain.com/frog/檸檬/

<?php 

/* Using Apache */ 
print_r($_GET); 
Array([A] => 'frog' [B] => 'lemon') 

/* Using Nginx */ 
print_r($_GET); 
Array([A] => [B] => [C] => 'lemon') 

?> 

什麼導致額外的數組參數?

紅利:我確定有一個更聰明的方法來編碼我上面的內容,你會如何寫你的重寫?

回答

2

也許路徑是通過一個初始/之前他們沒有?

路徑/frog/lemon/將規則

^([^/]*)/([^/]*)/([^/]*)/$ 

如被抓到[^ /] *將趕上也是零字符。

*指:零個或多個字符

+是指:至少一個炭

如果是這樣,/frog/lemon/

變得

^(zero chars here)/frog/lemon/$ 

因此A = '',B = '青蛙',C ='檸檬'

爲了解決這個問題,可以嘗試在一個/[^/]*這樣前:

rewrite ^/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3&D=$4&E=$5 last; 
rewrite ^/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /main.php??A=$1&B=$2&C=$3&D=$4 last; 
rewrite ^/([^/]*)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3 last; 
rewrite ^/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2 last; 
rewrite ^/([^/]*)/$ /main.php?A=$1 last; 

也許也把+代替*,在所有PARAMS不能爲空(不能是青蛙//檸檬)

rewrite ^([^/]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3&D=$4&E=$5 last; 
rewrite ^/([^/]+)/([^/]*)/([^/]*)/([^/]*)/$ /main.php??A=$1&B=$2&C=$3&D=$4 last; 
rewrite ^/([^/]+)/([^/]*)/([^/]*)/$ /main.php?A=$1&B=$2&C=$3 last; 
rewrite ^/([^/]+)/([^/]*)/$ /main.php?A=$1&B=$2 last; 
rewrite ^/([^/]+)/$ /main.php?A=$1 last; 
+0

我試着用加號代替第一個星號(每個規則)'以及所有的星號。無效全部產生了404。但是,您上面的最後一個示例,使用額外的斜槓,完美地工作 - 第一個查詢字符串param爲「A」並正確填充$ _GET超級全局。謝謝! – user2977468

+0

@ user2977468對不起,我剛剛編輯了答案,我錯過了將/放在前面,否則他們將無法捕捉路徑/ aaa/bbb / – FrancescoMM