2017-04-13 101 views
1

我正在構建一個內容管理系統,允許公司職員按類別列出。本質上,這是我想要實現的:。htaccess頁面重寫,拼寫錯誤

有一個頁面叫inside.php,其中包含404,500等錯誤。我們有一個名爲physicians.php的頁面,它傳遞變量並顯示基於變量的特定信息,因此physicians.php?id=1將顯示特定類別的員工成員。目前,當你去http://website.com/physicianshttp://website.com/physicians/它重定向到http://website.com/physicians.php就好,但問題是,即使你鍵入醫生一詞的一些變化發生。例如,physiciansasfhouiae仍然會鏈接到physicians.php,我們希望它鏈接到inside.php,因爲它在技術上是不存在的頁面。

這裏是重寫代碼,我現在有:

RewriteEngine on 

#enables you to access PHP files with HTML extension 
AddType application/x-httpd-php5 .html .htm 

RewriteCond ${REQUEST_URI} ^.+$ 
RewriteRule ^detail/(css|js|img)/(.*)?$ /$1/$2 [L,QSA,R=301] [OR] 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule^- [L] 

RewriteCond %{REQUEST_URI} physicians 
RewriteRule .* physicians.php 

RewriteRule ^physicians/((([a-zA-Z0-9_-]+)/?)*)$ physicians.php?id=$1 [NC,L] 

RewriteRule ^((([a-zA-Z0-9_-]+)/?)*)$ inside.php?page=$1 

回答

1

你應該刪除這兩條線入手:

RewriteCond %{REQUEST_URI} physicians 
RewriteRule .* physicians.php 

不僅是這兩條線沒有必要因RewriteRule這已經低於他們,但他們正在造成你注意到的主要問題。這兩行匹配任何網址與其中的子字符串「醫生」,這是不是你想要的。所以你需要讓你的匹配模式更具體;值得慶幸的是,接下來的RewriteRule線已經這樣做:

RewriteRule ^physicians/((([a-zA-Z0-9_-]+)/?)*)$ physicians.php?id=$1 [NC,L] 

這條線真的是你需要完成你想要的。它告訴Apache如果它是URL的第一個單詞並且以斜線(即整個「確切的詞」「醫師」)結尾,則只匹配「醫師」一詞,這將不匹配「physiciansasfhouiae」等拼寫錯誤。

但作爲一個建議,我會調整它稍微使可選尾隨斜線仍匹配,並從ID參數中刪除斜槓:

RewriteRule ^physicians(/((([a-zA-Z0-9_-]+)/?)*))?$ physicians.php?id=$4 [NC,L] 

因此,這將發送所有這些變化,以physicians.php :

/physicians 
/physicians/ 
/physicians/abc123 
/physicians/abc123/ 

而ID參數將等於abc123(如果提供的話)。所有其他請求將轉到inside.php,即使URL包含「醫生」的變體。

+0

不知道我完全理解爲什麼這個工程,但它的作品。謝謝。 – Cody