2013-08-19 55 views
0

我正在寫我的第一個htaccess,並希望幫助清理它並理解它。我遇到的第一個問題是具有多個參數。我目前的設置看起來像:htaccess簡化並刪除需要跟蹤斜線

Options +FollowSymLinks 

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !/(_modules|css|files|ico|img|js)/ 
RewriteRule ^([^/]*)$ index.php?p1=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !/(_modules|css|files|ico|img|js)/ 
RewriteRule ^([^/]*)/([^/]*)$ index.php?p1=$1&p2=$2 [L] 

RewriteCond %{REQUEST_FILENAME} !/(_modules|css|files|ico|img|js)/ 
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?p1=$1&p2=$2&p3=$3 [L] 

RewriteCond %{REQUEST_FILENAME} !/(_modules|css|files|ico|img|js)/ 
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [L] 

有沒有辦法簡化這個最多處理4個參數,所有這些都是可選的?這給我帶來了下一個問題,看起來如果你需要在參數後面有斜線,除非你使用全部4個參數。

總之,我想我的網址看起來像這樣...

http://www.example.com/home 
http://www.example.com/home/ 
http://www.example.com/blog/i-am-a-title 
http://www.example.com/blog/i-am-a-title/ 
http://www.example.com/varable1/varable2/varable3/varable4 
http://www.example.com/varable1/varable2/varable3/varable4/ 

我感謝所有幫助您可以提供。

+1

您是否在尋找這樣的網址?你在使用MVC模式嗎? http://example.com/index.php?controller=blog-title/i-am-a-title 您可以將控制器參數分爲$ parts [0] =「controller」,$ parts [ 1] =「方法」或類似的,如果$ parts [1]呈現單頁page.php等 –

+0

@josh我寧願有單獨的變量,如果我可以,如果不是我不介意切換到控制器變量。編寫我的代碼與控制器一起工作並不難。 –

回答

3

嗯,這是這類實驗的,正如你所說,將工作,但我認爲有可能是一個更好的方式來做到這一點:

RewriteCond %{REQUEST_FILENAME} !/(index\.php|_modules|css|files|ico|img|js)/ 
RewriteRule ^(([^/]*)/?)(([^/]*)/?)(([^/]*)/?)(([^/]*)/?)$ /index.php?p1=$2&p2=$4&p3=$6&p4=$8 [L] 

基本上我向每進入一個額外的組,所以你可以安全地排除一個不存在的羣體。

所以第一個元素是必需的,它是$2,第二個元素變成$4,第三個元素變成$6,最後一個元素變成$8

(([^/]*)/?)這基本上意味着任何不是/結尾或不與/爲外部組和內部組任何不是/

簡化規則多一點:

RewriteCond %{REQUEST_FILENAME} !/(index\.php|_modules|css|files|ico|img|js)/ 
RewriteRule ^([^/]*|)/?([^/]*|)/?([^/]*|)/?([^/]*|) /index.php?p1=$1&p2=$2&p3=$3&p4=$4 [L] 
+0

這回答了我的兩個問題和作品。謝謝! –

+0

@ RobertE.McIntosh不客氣。 – Prix

+0

@ RobertE.McIntosh查看底部,更簡化了一些規則。 '([^ /] * |)'最基本的區別就是匹配任何不是'/'或者什麼都不是的,所以如果下一個元素不是空變量,而且我們回到'$ 1','$ 2','' $ 3','$ 4'。 – Prix

1

只要你不介意的話,會有空白的參數,你可以用查找aheads您的所有PARAMATERS的:

RewriteCond %{REQUEST_FILENAME} !/(index\.php|_modules|css|files|ico|img|js) 
RewriteRule ^(?:([^/]+)|)(?:/([^/]+)|)(?:/([^/]+)|)(?:/([^/]+)|) index.php?p1=$1&p2=$2&p3=$3&p4=$4 [L] 

這些可選的問題是,你的規則將循環一次,這使得第一個捕獲組index.php。爲避免這種情況,您需要在條件中添加index.php作爲exlusion的一部分。

+0

你能幫我理解'(?:(([^ /] +)|)和'(([^ /] *)/?)之間的區別嗎?'我不確定哪個更好或最差使用 –

+0

@ RobertE.McIntosh請參閱:http://www.regular-expressions.info/refadv.html「分組和反向引用」,它是一個非捕獲組,允許您在不捕獲組並使用反向引用的情況下使用parens。 –