2013-06-29 39 views
1

我試圖讓mod_rewrite將所有非文件請求重定向到index.php,以便我可以處理乾淨URL的路由。mod_rewrite現有的目錄更改地址欄中的URL

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # Route requests to index.php for processing 
    RewriteCond %{REQUEST_FILENAME} !-f 

    RewriteRule ^(.+)$ index.php?request=$1 [QSA,L] 
</IfModule> 

出於某種原因,當我不帶後綴斜線訪問現有的目錄,地址欄被改造成包括尾隨斜線和查詢字符串,這是不是很乾淨。

我可以通過將RewriteRule更改爲^(.+)/$並添加RewriteBase /來改善此問題。但是,這會將所有網址指向尾部的斜槓。沒什麼大不了的,但不是我想要的。

如果,例如,/test/folder存在,我直接去,我想地址欄顯示,而不是顯示/test/folder//test/folder/?request=/test/folder

回答

1

好吧,持久有回報。 jerdiggity的回答提供了洞察力,這導致了進一步的實驗和研究。最終,我得出結論,Apache中必須有一些內容正在重寫尾部斜線。

由於可疑性,所有的重寫邏輯都是準確的,但在另一個與目錄相關的Apache模塊mod_dir中稱爲DirectorySlash Directive的是添加尾部斜線。

顯然,你可以簡單地禁用這個指令,這是我加入到我的邏輯的頂部:

DirectorySlash Off 
RewriteEngine On 
... 
+1

不錯。這裏有另外一個很好的[鏈接](http://www.askapache.com/htaccess/mod_rewrite-variables-cheatsheet.html)來加入書籤。 – jerdiggity

1

我想這給一個嘗試:

DirectoryIndex index.php 
<IfModule mod_rewrite.c> 
    RewriteEngine On 
    # I tested this inside a subdir named "stack", so I had to uncomment the next line 
    #RewriteBase /stack 

    # Route requests to index.php for processing 

    # Check if the request is NOT for a file: 
    RewriteCond %{REQUEST_FILENAME} !-f 

    # Check if the request IS for an existing directory: 
    RewriteCond %{REQUEST_FILENAME} -d 

    # If all criteria are met, send everything to index.php as a GET request whose 
    # key is "request" and whose value is the entire requested URI, including any 
    # original GET query strings by adding QSA (remove QSA if you don't want the 
    # Query String Appended): 
    RewriteRule .* index.php?request=%{REQUEST_URI} [R,L,QSA] 
</IfModule> 

如果不這樣做的工作,請讓我知道還有什麼在你的.htaccess文件,因爲在大多數情況下,它看起來像它應該正在工作。 應該。 ;)

+0

感謝您抽出時間回覆。通過添加'!-d'標誌,這個邏輯產生了現有目錄的目錄列表,這正是我想要避免的。我想用我的index.php路由器處理現有的目錄,但仍允許直接訪問文件。另外,爲了澄清,在我的問題中提出的代碼是我的.htaccess文件的完整。 – Quantastical

+0

OK顯然我錯誤地理解了原來的問題......我仍然不確定最終的URL是否因爲你寫了'如果/ test/d像地址欄顯示那個(這是我以前的答案應該做的),但也許這個最新版本會幫助你走上正確的軌道。我希望..? :) – jerdiggity