2016-01-06 110 views
0

我希望我錯過了一些愚蠢的東西。爲什麼前導斜槓不符合我的RewriteRule?

我試圖在OpenShift的免費託管服務上使用PHP 5.4盒式磁帶在Apache 2.2上使用.htaccess重定向URL。

這個URI /永久/ A123(注意該規則的過濾模式缺乏龍頭斜線)匹配:

RewriteEngine On 
RewriteRule permalink/a.*$ /permalink/b [R=301,L] 

這不符合URI /永久/ A123(注意在領先的斜槓規則的過濾模式):

RewriteEngine On 
RewriteRule /permalink/a.*$ /permalink/b [R=301,L] 

那麼,我有什麼愚蠢的東西有錯?

謝謝。

+0

我檢查過了:^ permalink/a。* $ matches,但^/permalink/a。* $不匹配。難道OpenShift的PHP 5.4盒式磁帶在我身上剝去了大量的斜線,而不是告訴我嗎?我還沒有找到任何配置文件,包括任何這樣的指令,但也許我不知道在哪裏看。 –

+2

隱含起始斜線。如果你想改變它,你可以使用'RewriteBase /'來改變規則適用的基本位置。 – Jon

+0

使用/permalink/(.*)$ – devpro

回答

3

通過刪除前導/,用於匹配RewriteRule中的模式的URI在每個目錄上下文中進行規範化(無論是在htaccess文件還是在<Directory>容器中)。因此,如果請求的URL是:

http://example.com/web/permalink/123 

並從文檔根目錄的htaccess文件中,該URI用於匹配規則是web/permalink/123。但在web文件夾中的htaccess文件中,URI是permalink/123

因此,你不能有你的格局開始與/,因爲他們從URI在htaccess文件的情況下剝離。

+0

這一切都是有道理的,但它並不能解釋爲什麼我在文檔根目錄中有另一個與前導斜槓匹配模式的.htaccess。 我現在看到了其他地方提到的一個區別:RewriteBase /。我在文檔根目錄中的.htaccess文件中使用了與前導斜槓相匹配的URI。我認爲這是我錯過的重要信息。 這就是說,我想我明白爲什麼我不應該在這些URI模式中使用前導斜槓。 –

+1

@ J.B.Rainsberger「RewriteBase」指令不影響重寫規則的* pattern *中的前導斜槓,它影響規則的目標(它將基礎追加到相對目標)。差別可能是'RewriteRule/foo'與'RewriteRule ^/foo'。第一個匹配URI中的任何**'/ foo',第二個匹配'^'並且只匹配URI的開頭,並且會失敗,因爲開頭沒有'/'。 –

+0

晶瑩剔透。謝謝。我想我終於明白了。 –

相關問題