2015-04-28 47 views
0

可能我的問題與其他標題重複,但我已經閱讀了太多的標題,並與谷歌多次檢查。所以如果它重複,我很抱歉。Apache的URL重寫規則和正則表達式

現在我有一個網址:

www.mysite.com/profile.php 

我使用這個URL重寫規則:

RewriteRule ^([A-Za-z0-9-_]+)/?$ profile.php?username=$1 [NC,L] 

而且我可以改變我的網址,如:

www.mysite.com/username 

然後,我需要更新我的網址與其他獲取參數:

www.mysite.com/username/photos 

在這個部分,我有一個像網址:

www.mysite.com/profile.php?username=xxx&w=photo 

我已經試過這個URL規則的URL上面:

RewriteRule ^([A-Za-z0-9-_]+)/?$/?$ profile.php?username=$1&w=$2 [NC,L] 

,但它不能正常工作。請幫忙。

非常感謝。

------- ------ UPDATE

現在我可以用profile.php它應該是。但其他重寫規則被破壞。這樣我目前的.htaccess文件:

RewriteEngine On 

RewriteRule ^([\w-]+)/([\w-]+)/?$ profile.php?username=$1&w=$2 [QSA,L] 
RewriteRule ^([\w-]+)/?$ profile.php?username=$1 [QSA,L] 
RewriteRule ^p/timeline timeline.php [NC,L] 
RewriteRule ^p/notifications notifications.php [NC,L] 

回答

1

第一件事第一:

[A-Za-z0-9-_] 

不是因爲在充當十六進制39和六角5F之間的範圍中的字符類9_之間未轉義連字符的正確正則表達式。爲了解決這個問題,請確保在字符類的第一個或最後一個位置使用連字符。

正確的規則將是:

RewriteRule ^([\w-]+)/([\w-]+)/?$ profile.php?username=$1&w=$2 [QSA,L] 
RewriteRule ^([\w-]+)/?$ profile.php?username=$1 [QSA,L] 

更新:

根據您的更新問題,確保特定規則後使用通用規則。所以你的規則是這樣的:

RewriteRule ^p/(notifications|timeline)/?$ $1.php [NC,L] 
RewriteRule ^([\w-]+)/([\w-]+)/?$ profile.php?username=$1&w=$2 [QSA,L] 
RewriteRule ^([\w-]+)/?$ profile.php?username=$1 [QSA,L] 
+0

你能否再次檢查我的問題與我的更新。 – Mehmet

0
RewriteRule ^([A-Za-z0-9-_]+)/(.+)$ profile.php?username=$1&w=$2 [NC,L] 
RewriteRule ^([A-Za-z0-9-_]+)$ profile.php?username=$1 [NC,L] 
+0

它的工作,但我又有一個問題。當第二個get參數爲null時,此規則不起作用。我想同時使用** mysite.com /用戶名**和** mysite.com /用戶名/詳細信息**。那麼我應該有多少規則? – Mehmet

+0

@Mehmet只是使用這兩個條件。看我的編輯。 – Peter

0

你只需有一個規則,如果你想要的。我還會添加條件,以確保它不是真正的目錄或文件。

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([A-Za-z0-9-_]+)/?([A-Za-z0-9-_]+)?/?$ /profile.php?username=$1&w=$2 [NC,L] 

在你的PHP你只需要檢查w參數,看看它是否是空的。如果不是,則也顯示細節。