我想學習一些.htaccess
技巧。我遇到了RewriteBase
指令,但無法使其正常工作。RewriteBase做什麼以及如何使用它?
我想知道這個指令具體是什麼以及如何使用它。關於StackOverflow中的RewriteBase
和Apache文檔已經有一些討論,但仍然無法明確地回答我的問題。
有人可以告訴我一個簡單但有效的例子,其中RewriteBase
可以使用?
我想學習一些.htaccess
技巧。我遇到了RewriteBase
指令,但無法使其正常工作。RewriteBase做什麼以及如何使用它?
我想知道這個指令具體是什麼以及如何使用它。關於StackOverflow中的RewriteBase
和Apache文檔已經有一些討論,但仍然無法明確地回答我的問題。
有人可以告訴我一個簡單但有效的例子,其中RewriteBase
可以使用?
在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/
就是這樣。
謝謝爲您的全面答覆。現在看來,RewriteBase只在你想使用R標誌時纔有用。當我在/ subdir1 /中試過這個:RewriteEngine on | RewriteBase/subdir1/subsubdir/| RewriteRule foo bar.php,對「example.com/subdir1/foo」的請求不會被映射到「example.com/subdir1/subsubdir/bar.php」。爲什麼不呢? –
@ChongLipPhang不確定,但是[對我有用](http://i.stack.imgur.com/LJOGL.png)。 –
@JonLin,那麼是否有一個「RewriteBase」等同於「捕獲URL」?例如,在'/ subdir1/.htaccess'裏面,當我訪問'/ subdir1/foo'時,我有命令'RewriteRule ^(。*)$ -',它捕獲字符串'foo'。我們如何才能使它捕獲整個'/ subdir1/foo'而不是僅僅'foo'? – Pacerier
1行答案是:Rewritebase設置重寫代碼arg2的基路徑。
這就是字面意思。 (所以它的作品像html basehref,⨕ except it's useful,因爲經常在URL重寫默認基地[.
]的上下文是而不是通緝。)
如果您有多個重寫程序,Rewritebase使維護更容易。實際上,如果你只使用一行重寫代碼,那麼rewritebase幾乎沒用(因爲你可以簡單地重寫基礎url)。
當然,你可以忽略rewritebase 完全,通過只使用的RewriteRules絕對路徑。
同樣的問題在以前的位置問:http://stackoverflow.com/questions/704102/how-does-rewritebase-work-in-htaccess(雖然下面的答案可能是最全面的) –
[RewriteBase如何在.htaccess中工作]的可能的重複(https://stackoverflow.com/questions/704102/how-does-rewritebase-work-in-htaccess) –