2010-06-28 191 views
10

我正在使用一個.htaccess文件來將目錄的請求定向到提供有關該目錄的信息的自定義php文件(並且我希望瀏覽器顯示的URL不會更改)。mod_rewrite:添加尾部斜槓?

這裏是.htaccess文件的相關部分。

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

這種運作良好,如果你去到一個目錄,包括尾隨斜線:

http://domain.com/path/ 

但是,如果沒有最後的斜線,它不

http://domain.com/path 

的網址(如圖所示在瀏覽器中)變成:

http://localhost:8888/path/?url=/path 

我試着加入這個規則之上的規則解決這個:

RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

但不是爲我工作。

我該如何獲得.htaccess添加尾部斜槓,如果它被省略,然後就像它在那裏一樣?

謝謝

更新: 按照要求,這裏是整個事情。

<IfModule mod_rewrite.c> 
RewriteEngine On 

#force trailing slashes on real directories 
RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

#use the directory viewer on directories without an index page 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

</IfModule> 
+0

根據你描述我認爲有一些錯誤的另一部分的行爲的指令你的'.htaccess'文件,所以你介意發佈整個事情? – 2010-06-28 18:45:26

回答

8

感嘆。

這條線:

RewriteCond %{REQUEST_FILENAME} -D 

本來應該是:

RewriteCond %{REQUEST_FILENAME} -d 
0

您是不是要找

RewriteRule ^(.*)$ $1/ [L] 

呢?

我不知道你的方法。我會嘗試像

RewriteRule ^/(\S+)/?$ /myphp.php?url=$1 

我用這個重寫之前,它的工作原理:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^domain\.com 
RewriteRule ^(.*)$ http://www.domain.com$1 
RewriteRule ^/(\S+)/?$ /myphp.php?url=$1 

請注意,我並沒有包括在第一個規則最後的斜線。除非絕對必要,否則我會建議你不要依賴.htaccess。這是因爲服務器會不斷檢查.htaccess文件。改爲使用httpd.conf文件意味着apache只會加載一次條件和規則。至少我被建議這樣做是因爲這個。

+0

你說得對,那應該是*,而不是?修正了這個問題。我試着用你的建議,但效果相同。要在我的問題和版本中的版本中清楚,重定向將轉到正確的位置。問題是瀏覽器顯示的文本。我不希望用戶看到查詢字符串。我只希望他們看到目錄的路徑,並以斜線結尾。 – bkit 2010-06-29 18:25:08

+0

您是否嘗試僅在httpd.conf文件而不是.htaccess文件中添加代碼?您可以將其保存在單獨的httpd-extra.conf文件中,然後在httpd.conf文件的末尾使用include命令。 我使用此代碼來實現你想要的,所以我可以提供更多的用戶友好的網址。最後一行應該提供:將(內部)/ path重寫爲/myphp.php?url=path,因此您的瀏覽器僅顯示第一個。 希望有所幫助。 – misterte 2010-06-29 18:41:00

0

試試這個。它會將尾部斜槓添加到沒有結尾斜槓的目錄請求中。

<IfModule mod_rewrite.c> 
RewriteEngine On 

#use the directory viewer on directories without an index page 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*?)/?$ /myphp.php?url=$1/ [QSA,L] 

</IfModule> 
4

不要與現代重寫打擾,有它

<Location /some/path> 
    DirectorySlash On 
    SetHandler some-handler 
</Location> 

http://httpd.apache.org/docs/2.2/mod/mod_dir.html

+0

「DirectorySlash Off」做相反的事情時,它會在請求資源是目錄時禁用mod_dir自動斜槓附加。默認打開。爲什麼不爲OP工作是未知的,也許mod_dir沒有加載 – higuita 2014-07-09 10:14:48