2016-09-10 21 views
1

這是我的問題:如何使mod_rewrite在沒有指定路徑的子目錄中正確重定向?

比方說,我有一個網站,www.example.com。我有一個應用程序subdir位於該域的文檔根目錄的子目錄:

/home/example/public_html/subdir/

subdir包含此.htaccess

# Redirect trailing slash if not a directory 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /subdir/$1 [L,R=301] 

它的工作原理。如果我去http://www.example.com/subdir/not_a_directory/(顯然假設not_a_directory不是目錄),我會重定向到http://www.example.com/subdir/not_a_directory,這正是我想要的。

但我不想在重寫規則中指定subdir.htaccess中的任何位置。我希望能夠在不破壞任何內容的情況下更改應用程序的路徑。我嘗試以下...

# Redirect trailing slash if not a directory 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ $1 [L,R=301] 

,但我得到重定向到:http://www.example.com/home/example/public_html/subdir/not_a_directory

我有點明白,爲什麼出現這種情況(用於重寫規則的相對路徑返回一個文件系統路徑,而絕對或根絕對路徑返回一個URL),但我無法弄清楚如何實現我在找的東西。

難道沒有辦法讓RewriteRule中的捕獲組包含subdir部分路徑嗎?我也嘗試設置RewriteBase /,但它似乎沒有改變任何東西。

重寫規則使我困惑很多,所以任何幫助將不勝感激。謝謝!

回答

1

您可以使用此規則沒有在.htaccess指定subdir的任何地方:

RewriteEngine On 

# Remove trailing slash if not a directory 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} ^(/.+)/$ 
RewriteRule /$ %1 [L,R=301,NE] 

RewriteCond %{REQUEST_URI}捕捉路徑讓我們捕捉完整的URI路徑。

+1

是的,謝謝!我注意到'REQUEST_URI'包含'subdir',但我沒有意識到我可以在RewriteCond中使用捕獲組(或者說,忘記了我可以)。還有兩個問題:1.我想我可以用'RewriteRule ^'替換'RewriteRule/$',因爲第二個RewriteCond已經只能重寫以斜線結尾的URL了,這是對的嗎? 2.爲什麼NE(noescape)標誌? – benface

+1

是的'RewriteRule ^'在這裏完全沒問題,'NE'是爲了避免URL中的某些特殊字符被編碼。 – anubhava

+0

有沒有我們不想要'NE'的情況? – benface

0

試試這個位置rewritebase

RewriteBase subdir/ 
+1

OP寫道:'我不想在重寫規則中指定子目錄或在.htaccess中的任何地方' – anubhava

相關問題