2011-07-13 82 views
0

我是新來使用.htaccess文件,所以我遇到一些錯誤:htaccess的mod_rewrite的問題

具體來說,我有三個問題,我的mod_rewrite的嘗試。

我需要它能夠解析有限的領域,如mydomain.com/user吐出來爲mydomain.com/elements/scripts/view/?pth=usermydomain.com/user/register-newmydomain.com/elements/scripts/view/?pth=user&ext=register-new

我目前有:

RewriteRule ^/([A-Za-z0-9]+)/(.*)$ /elements/scripts/view?pth=$1&ext=$2 [NC,L] 

我不知道這是否工作或者不是,因爲L標誌似乎沒有被觸發,並且它重寫了它,然後由於某種原因再次用pth=elements&ext=scripts/view重寫它。

我的另一個問題是我能夠知道它是如何被重寫的。我希望mod_rewrite對用戶是不可見的(瀏覽器仍然顯示mydomain.com/user),但它目前將瀏覽器URL更改爲RewriteRule替換。

任何幫助將不勝感激,謝謝!

回答

0

試試這個,而不是使用:

RewriteRule ^user/?(([^/]+)/?)?$ /elements/scripts/view?pth=user&ext=$2 [QSA,NC,L] 
  1. 你的規則是一種方式來廣泛..它重寫到另一個非固定的目標URL(不/index.php或類似的東西 - 我不能告訴/elements/scripts/view是否是一個真正的文件...或另一個「虛擬」路徑)。

  2. 因爲您需要URL才能使用/user路徑,所以我將其硬編碼爲一條規則 - 這使規則更加具體。

  3. 此規則需要放置在網站根文件夾中的.htaccess。對於任何其他位置,它需要一些小的修改。

  4. 將規則放置在適當的位置 - 規則順序重要


「我不知道這是否管用,因爲L標誌似乎並沒有被觸發,並改寫它,然後用pth=elements&ext=scripts/view出於某種原因再次改寫它。 「

阿帕奇後看到[L]標誌停止進一步改寫(如果規則匹配,當然),轉移到下一個迭代開始檢查從開始的所有規則 - 這是它如何工作的,很多人似乎不知道的這個事實。

您可能有其他一些可能會產生此類行爲的規則。但最有可能的是你現在的規則完成 - 你擁有的模式(正則表達式)是非常廣泛的,可以捕獲已經重寫的URL(/elements/scripts/view)並重寫它(模式將匹配)。


UPDATE: 根據附加信息您提供這些規則可以用來代替(1條規則匹配所有):

Options +FollowSymLinks -MultiViews 

RewriteEngine On 
RewriteBase/

# Do not do anything for already existing files 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule .+ - [L] 

RewriteRule ^([a-z0-9]+)(/?(.*))$ /elements/scripts/view/index.php?pth=$1&ext=$3 [QSA,NC,L] 
  1. 這些規則將不重寫請求已經存在的文件(例如css/jpg/js文件)。

  2. 當對這樣的URL:mydomain.com/user/register-new發出請求時,它將被重寫爲 /elements/scripts/view/index.php?pth=user&ext=register-new並且重寫進入下一次迭代。在下一次迭代中,規則#1將告訴Apache停止重寫..因爲/elements/scripts/view/index.php文件確實存在。任務完成。

如果上述不利於某些原因(例如,你仍然需要重寫請求到實際存在的文件,並動態地爲他們服務),而使用這些:

Options +FollowSymLinks -MultiViews 

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_URI} !^/elements/scripts/view/index.php [NC] 
RewriteRule ^([a-z0-9]+)(/?(.*))$ /elements/scripts/view/index.php?pth=$1&ext=$3 [QSA,NC,L] 

RewriteCond告訴阿帕奇如果它已經指向/elements/scripts/view/index.php,則不要重寫URL。任何其他URL可以重寫,如果它將匹配模式。


請記住,因爲我不知道所有可能的網址,你可能有(網址結構),該模式可以需要有點扭捏。

+0

對不起,我沒有寫的很清楚(我一直在努力讓它工作)。我需要它來處理其他事情。實際上,除了元素文件夾以外的所有內容是否有可能使重寫對客戶端不可見? – Brian

+0

@Brian你最好把它分成幾條規則。如果你想要1條規則匹配所有 - 你也可以這樣做 - 但爲此,你必須提供**更多**信息,而不僅僅是2個URL。我已經描述了爲什麼你現在的規則做了「怪異的」重寫。我不清楚'/ elements/scripts/view'是那個物理文件(那麼爲什麼沒有擴展名)或什麼?但最初的問題已得到解答 - 所提供的規則對於所提及的網址可以正常工作。如果您想要覆蓋其他規則,請提供其他詳細信息。 – LazyOne

+0

基本上我想要它做的是能夠採取任何頁面目錄('/用戶','/商店','/愚蠢鏈接'等),並將其交給'/ elements/scripts/view/index.php'作爲$ _GET變量'pth'。視圖頁面在數據庫中查找頁面,並根據它顯示給用戶,這樣就可以編輯頁面而不必訪問ftp。第二個變量($ ext)是用於給頁面的任何附加命令,比如'/ user/submit-new'將被解析爲'顯示用戶頁面,命令提交一個新的用戶帳戶' – Brian