2017-07-26 70 views
1

我在PHP中關於重定向的一些問題,我用的.htaccess這個,但沒有成功 我有什麼htaccess的是以下2個網址:重定向通過在PHP

http://localhost/PROJECT_NAME/USERNAME/348 

http://localhost/PROJECT_NAME/USERNAME 

什麼我想在這裏是:

1)如果請求從

http://localhost/PROJECT_NAME/USERNAME/111 

然後來到它應該去:

http://localhost/PROJECT_NAME/index.php 

2)如果請求從

http://localhost/PROJECT_NAME/USERNAME 

來到那麼就應該去:

http://localhost/PROJECT_NAME/detail.php 

我試了一下:

RewriteRule /(\w+)$ detail.php?id=$1 [L] 
RewriteRule /(\w+)$ index.php [L] 
RewriteRule /$ detail.php?id=$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !index.php 
RewriteCond %{REQUEST_URI} !(.*)/$ 

沒有成功在此之後CEED它工作得很好指數而不是詳細信息頁面,請提前

Randheer

回答

0

你這裏有幾個問題幫助謝謝你們的時間。首先是匹配的順序和特異性。

首先,一個很大的疑難雜症的正則表達式學習者:\w(簡寫「字」字類)相當於[A-Za-z0-9_]。 。 。請注意包含的數字和下劃線!

假設所有在最後一個片段的ID是只有數字和用戶名是字母,數字小的都有些混,和/或下劃線,你可以改變匹配的順序和使用\d(數字)字符類第一:

RewriteRule /(\d+)$ index.php [L] 
RewriteRule /(\w+)$ detail.php?id=$1 [L] 

這應該涵蓋你的兩個例子。

您沒有列出第三條規則的用例,因此我不確定您要將哪些網址應用於或將如何更改。這裏有一些觀察,但:

  1. 你應該把RewriteCond它們適用於RewriteRule之前。 (請注意,重寫規則的表達式實際上是先檢查,然後是條件。)
  2. 現在,RewriteRule表達式將匹配任何以不是真實文件的尾部斜線結尾的內容。
  3. 還檢查它不是index.php對於!-f是多餘的。並且由於您使用的是尾部斜線,因此您可能實際上需要檢查它不是目錄(與文件相對)使用!-d
  4. RewriteCond表達式試圖在否定表達式內捕獲(因此它永遠不會捕獲任何東西,或比賽以來的有效表達,物質是一樣的一個在規則,/$

如果你想允許上的用戶名一個斜線上面,你可以只添加到什麼是已經there:

RewriteRule /(\d+)$ index.php [L] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule /(\w+)/?$ detail.php?id=$1 [L] 

如果第三條規則的用例有所不同,或者這些RewriteCond表達式針對的是不同於您所粘貼的規則的其他規則,請隨時根據詳細信息編輯問題,並且我可以更新我的答案以解決該問題。

+0

非常感謝您的回覆。 我想上面的選項,但它沒有工作 的主要問題是與以下網址: 的http://本地主機/ PROJECT_NAME/USERNAME 它不重定向到「detail.php」 –

+0

頁@RandheerSinghChouhan數事情:1.其他規則是否正常工作?如果沒有,那麼'RewriteEngine On'出現在這些行之前? 2.您嘗試了以上哪個版本的代碼? 3.這個.htaccess文件位於哪個路徑?另外,瀏覽器內部不應該發生重定向 - 這些規則的目的是*重寫*將請求文件指向Apache的請求(對用戶透明)。如果您想要發出客戶端重定向(例如響應代碼301或302),則需要相應地使用「[R]」或「[R = 301]」標誌。 – justbeez