2014-01-25 16 views
33

我想學習一些.htaccess技巧。我遇到了RewriteBase指令,但無法使其正常工作。RewriteBase做什麼以及如何使用它?

我想知道這個指令具體是什麼以及如何使用它。關於StackOverflow中的RewriteBase和Apache文檔已經有一些討論,但仍然無法明確地回答我的問題。

有人可以告訴我一個簡單但有效的例子,其中RewriteBase可以使用?

+2

同樣的問題在以前的位置問:http://stackoverflow.com/questions/704102/how-does-rewritebase-work-in-htaccess(雖然下面的答案可能是最全面的) –

+0

[RewriteBase如何在.htaccess中工作]的可能的重複(https://stackoverflow.com/questions/704102/how-does-rewritebase-work-in-htaccess) –

回答

70

在htaccess文件中,mod_rewrite的作用類似於<Directory><Location>容器。並使用RewriteBase來提供相對路徑基礎。

例如,假設你有這樣的文件夾結構:

root 
|-- subdir1 
|-- subdir2 
     |-- subsubdir 

所以,你可以訪問:

  • http://example.com/(根)
  • http://example.com/subdir1(subdir1)
  • http://example.com/subdir2(subdir2)
  • http://example.com/subdir2/subsubdir(subsubdir)

通過RewriteRule發送的URI與目錄相關。所以,如果您有:

RewriteRule ^(.*)$ - 

,並且請求/a/b/c/d,然後捕獲的URI($1)爲a/b/c/d。但是如果規則是subdir2而請求是/subdir2/e/f/g那麼捕獲的URI是e/f/g。如果規則是subsubdir,請求是/subdir2/subsubdir/x/y/z,則捕獲的URI是x/y/z。規則所在的目錄將該部分從URI中剝離出來。重寫基礎對此沒有影響,這只是每個目錄的工作原理。

什麼重寫基地要做的,就是提供一個URL路徑基地(文件路徑基地)在規則的目標任何相對路徑。所以說,你有這樣的規則:

RewriteRule ^foo$ bar.php [L] 

bar.php是相對路徑,而不是:

RewriteRule ^foo$ /bar.php [L] 

其中/bar.php是一個絕對路徑。絕對路徑總是是「根」(在上面的目錄結構中)。這意味着如果規則在「根」,「subdir1」,「subsubdir」等。/bar.php路徑始終映射到http://example.com/bar.php

但是另一個規則是相對路徑,它是基於規則所在的目錄。所以,如果

RewriteRule ^foo$ bar.php [L] 

是「根」和你去http://example.com/foo,你得到服務http://example.com/bar.php。但是,如果該規則位於「subdir1」目錄中,並且您轉到http://example.com/subdir1/foo,則會獲得服務http://example.com/subdir1/bar.php。等等。這有時有效,有時候不會如文檔所述,它應該是要求的相對路徑,但大多數時候它似乎工作。除非您重定向(使用R標誌,或者因爲您的規則目標中有http://host)。這意味着這條規則:

RewriteRule ^foo$ bar.php [L,R] 

,如果它是在「subdir2」目錄,你去http://example.com/subdir2/foo,mod_rewrite的會誤以爲是因爲R標誌的文件路徑,而不是一個URL路徑和相對路徑,你最終會被重定向到如下所示:http://example.com/var/www/localhost/htdocs/subdir1。這顯然不是你想要的。

這是RewriteBase進來的地方。該指令告訴mod_rewrite要追加到每個相對路徑的開始處。所以,如果我有:

RewriteBase /blah/ 
RewriteRule ^foo$ bar.php [L] 

和規則在「subsubdir」,要http://example.com/subdir2/subsubdir/foo實際上會爲我服務http://example.com/blah/bar.php。 「bar.php」被添加到基地的末端。實際上,這個例子通常不是你想要的,因爲你不能在同一個目錄容器或htaccess文件中有多個基地。

在大多數情況下,它的使用是這樣的:

RewriteBase /subdir1/ 
RewriteRule ^foo$ bar.php [L] 

其中這些規則將在 「subdir1」 目錄和

RewriteBase /subdir2/subsubdir/ 
RewriteRule ^foo$ bar.php [L] 

將在 「subsubdir」 目錄。

這部分地允許您使您的規則可移植,因此您可以將它們放在任何目錄中,只需要更改基礎而不是一堆規則。例如,如果您有:

RewriteEngine On 
RewriteRule ^foo$ /subdir1/bar.php [L] 
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L] 
RewriteRule ^blah2$ /subdir1/blah2.php [L] 
... 

,從而將http://example.com/subdir1/foo將成爲http://example.com/subdir1/bar.php等,說你決定把所有這些文件和規則的移動到「subsubdir」目錄。取而代之的/subdir1/每個實例更改爲/subdir2/subsubdir/,你可能只是有一個基地:

RewriteEngine On 
RewriteBase /subdir1/ 
RewriteRule ^foo$ bar.php [L] 
RewriteRule ^blah1$ blah.php?id=1 [L] 
RewriteRule ^blah2$ blah2.php [L] 
... 

然後當你需要這些文件和規則移動到另一個目錄,只是改變了基礎:

RewriteBase /subdir2/subsubdir/ 

就是這樣。

+0

謝謝爲您的全面答覆。現在看來,RewriteBase只在你想使用R標誌時纔有用。當我在/ subdir1 /中試過這個:RewriteEngine on | RewriteBase/subdir1/subsubdir/| RewriteRule foo bar.php,對「example.com/subdir1/foo」的請求不會被映射到「example.com/subdir1/subsubdir/bar.php」。爲什麼不呢? –

+0

@ChongLipPhang不確定,但是[對我有用](http://i.stack.imgur.com/LJOGL.png)。 –

+1

@JonLin,那麼是否有一個「RewriteBase」等同於「捕獲URL」?例如,在'/ subdir1/.htaccess'裏面,當我訪問'/ subdir1/foo'時,我有命令'RewriteRule ^(。*)$ -',它捕獲字符串'foo'。我們如何才能使它捕獲整個'/ subdir1/foo'而不是僅僅'foo'? – Pacerier

0

1行答案是:Rewritebase設置重寫代碼arg2的基路徑

這就是字面意思。 (所以它的作品像html basehref,⨕ except it's useful,因爲經常在URL重寫默認基地[.]的上下文是而不是通緝。)

如果您有多個重寫程序,Rewritebase使維護更容易。實際上,如果你只使用一行重寫代碼,那麼rewritebase幾乎沒用(因爲你可以簡單地重寫基礎url)。


旁註

當然,你可以忽略rewritebase 完全,通過只使用的RewriteRules絕對路徑。


相關

相關問題