2017-08-17 40 views
1

我有我的應用程序兩個重寫規則:多個htacces mod_rewrites

的第一條規則是/chef/index.php規則:

/chef/name -> /chef/?id=1234 

第二條規則是/recipes/index.php規則:

/r/name/nice-name-for-recipe -> 
    /recipes/?id=1234&nice_name=nice-name-for-recipe-name 

這兩個規則分開工作,但是如果我啓用它們兩個:

  • 第一個廚師規則不起作用,
  • 第二個食譜規則似乎工作。

我試圖交換規則的順序,但我仍然無法讓它們都工作。

規則:

RewriteEngine On 

RewriteRule ^([a-zA-Z0-9_-]+)/chef/$ $1 [QSA] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /chef/index.php?id=$1 [QSA] 

RewriteRule ^([a-zA-Z0-9_-]+)/r/$ $1/$2 [QSA] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /recipes/index.php?id=$1&nice_name=$2 [QSA] 

回答

1

在第一條規則中,您試圖匹配^([a-zA-Z0-9_-]+)/chef/$/chef/$意味着它匹配的網址與/chef/結束, 因爲$意味着字符串的結尾,例如:

http://anything.dev/chef/ 

所以它不匹配/chef/name/,它匹配/chef/

同樣,你的第二條規則不匹配/r/name/nice-name-for-recipe, 它匹配/r/$

這些規則只是告訴Apache退回到靜態文件。 如果您需要提供靜態文件 ,這很有用,但它們與此問題無關。

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

所以你的規則大致只是:

RewriteRule ^(.*)$ /chef/index.php?id=$1 [QSA] 
RewriteRule ^(.*)$ /recipes/index.php?id=$1&nice_name=$2 [QSA] 

現在很清楚,爲什麼這些規則獨立工作,但如果你把它們放在一起只有第二個作品。

它們都匹配^(.*)$,即每個url(除了那些靜態文件的url)。 因此,當他們放在一起,只有第二個勝利。

所以,真正的規則效果:

/chef/name -> 
    /chef/index.php?id=/chef/name&nice_name= 

/r/name/nice-name-for-recipe -> 
    /chef/index.php?id=/r/name/nice-name-for-recipe&nice_name= 

附:我認爲這個問題的深層原因是:

  1. 您試圖編寫正則表達式而不理解它們。

  2. 正則表達式的語法很難理解。具體而言,$既用作模式也用作可變前綴。

  3. index.php代碼很髒。它不應該盲目接受網址。如果出現index.php錯誤,這兩個規則似乎不起作用。髒代碼很難檢測和定位問題,並且不安全(攻擊者可以構建危險的特殊URL)。

  4. 由於$2未設置,因此您的IDE不夠智能以提醒您注意RewriteRule ^(.*)$ /recipes/index.php?id=$1&nice_name=$2 [QSA]

0

你寫了,你要轉換成dev.website.com/chef/namedev.website.com/chef/?id=1234。由於目標網址中的ID不存在於源網址中,因此無法使用,因此您需要考慮如何在原始網址中包含此ID。

一旦您對此進行了排序,我建議您閱讀更多關於正則表達式的信息來修復mod_rewrite規則。 這裏是測試和解釋正則表達式的好資源:https://regex101.com/

+0

謝謝你的資源。但是,問題是我想dev.website.com/chef/name打印dev.website.com/chef/?id=1234哪些工作的內容。正當我添加另一個只有第二個影響。 – BDeGiglio