2017-05-07 81 views
1

沒有工作在我的服務器(Apache 2.2的)我有這樣的結構:的.htaccess中的子目錄確實落後重寫規則

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/
    RewriteCond "%{DOCUMENT_ROOT}/cache/%{REQUEST_URI}/index.html%" -f 
    RewriteRule .* "/cache/%{REQUEST_URI}/index.html" [L] 
</IfModule> 

htaccess的上:

/.htaccess 
/cache/test-uri/.htaccess 
/cache/test-uri/index.html 

/.htaccess htaccess的子目錄/cache/test-uri/.htaccess

<IfModule mod_headers.c> 
    Header set X-Test "Test OK" 
</IfModule> 

/cache/test-uri/index.html內容:

<html> 
    <head></head> 
    <body>Test OK</body> 
</html> 

,如果我在瀏覽器中http://example.com/test-uri/打開我看到Test OK的響應內容,但不是在響應頭,這意味着比.htaccess根的作品,但在/cache/test-uri/文件夾中的.htaccess沒有按」工作。

如果我在瀏覽器中打開http://example.com/cache/test-uri/,我會在響應內容和響應標題中看到Test OK。這意味着/cache/test-uri/文件夾中的.htaccess工作正常(如果直接調用而不是後面的重寫規則)。

問題是:.htaccess在重寫規則後面不起作用?

+1

在Apache 2.4上這種情況似乎有效。內部重定向路徑確實會影響上層htaccess。 – Deadooshka

+0

這是一個孤立的測試案例嗎?任何其他指令或'.htaccess'文件? '/ test-uri'是一個根目錄下的物理目錄,還是請求URL完全是虛擬的? – MrWhite

回答

1

原則上,這應該工作(同時測試Apache 2.2和Apache 2.4)。但是,你有你的的TestString的錯誤總是會導致失敗的匹配:

RewriteCond "%{DOCUMENT_ROOT}/cache/%{REQUEST_URI}/index.html%" -f 
RewriteRule .* "/cache/%{REQUEST_URI}/index.html" [L] 

%RewriteCond的TestString是文字%結束,所以這條件將永遠失敗。

此外,REQUEST_URI服務器變量總是以斜槓開始,所以你不應該包括在的TestStringRewriteRule替代額外的斜槓,否則你最終以雙斜線(//)。雖然Apache爲了路由請求而減少了多個斜槓,但這些雙斜槓仍然存在於多個服務器變量(以及內部請求)中,所以如果這些變量不被期望,這仍然會破壞一些腳本。

個人而言,在.htaccess,我會用一個反向引用到RewriteRule模式並保持斜線。例如:

RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f 
RewriteRule (.*) /cache/$1/index.html [L]