試試這個,而不是使用:
RewriteRule ^user/?(([^/]+)/?)?$ /elements/scripts/view?pth=user&ext=$2 [QSA,NC,L]
你的規則是一種方式來廣泛..它重寫到另一個非固定的目標URL(不/index.php
或類似的東西 - 我不能告訴/elements/scripts/view
是否是一個真正的文件...或另一個「虛擬」路徑)。
因爲您需要URL才能使用/user
路徑,所以我將其硬編碼爲一條規則 - 這使規則更加具體。
此規則需要放置在網站根文件夾中的.htaccess。對於任何其他位置,它需要一些小的修改。
將規則放置在適當的位置 - 規則順序重要。
「我不知道這是否管用,因爲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]
這些規則將不重寫請求已經存在的文件(例如css/jpg/js文件)。
當對這樣的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可以重寫,如果它將匹配模式。
請記住,因爲我不知道所有可能的網址,你可能有(網址結構),該模式可以需要有點扭捏。
對不起,我沒有寫的很清楚(我一直在努力讓它工作)。我需要它來處理其他事情。實際上,除了元素文件夾以外的所有內容是否有可能使重寫對客戶端不可見? – Brian
@Brian你最好把它分成幾條規則。如果你想要1條規則匹配所有 - 你也可以這樣做 - 但爲此,你必須提供**更多**信息,而不僅僅是2個URL。我已經描述了爲什麼你現在的規則做了「怪異的」重寫。我不清楚'/ elements/scripts/view'是那個物理文件(那麼爲什麼沒有擴展名)或什麼?但最初的問題已得到解答 - 所提供的規則對於所提及的網址可以正常工作。如果您想要覆蓋其他規則,請提供其他詳細信息。 – LazyOne
基本上我想要它做的是能夠採取任何頁面目錄('/用戶','/商店','/愚蠢鏈接'等),並將其交給'/ elements/scripts/view/index.php'作爲$ _GET變量'pth'。視圖頁面在數據庫中查找頁面,並根據它顯示給用戶,這樣就可以編輯頁面而不必訪問ftp。第二個變量($ ext)是用於給頁面的任何附加命令,比如'/ user/submit-new'將被解析爲'顯示用戶頁面,命令提交一個新的用戶帳戶' – Brian