2017-05-07 3 views
1

の背後にある作品(のApache 2.2は、i)は、この構造を持っていない:ルート/.htaccessは私のサーバー上でのRewriteRule

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

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ファイルサブディレクトリ/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> 

私は応答内容にTest OKを参照してくださいhttp://example.com/test-uri/ブラウザで開くが、応答ヘッダーで、これはルート作品に.htaccessよりも意味はないが、/cache/test-uri/フォルダ内の.htaccess」のdoesnの場合仕事。

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の終わりに%はリテラル%あるので、この条件は常に失敗します。

あなたがそうでなければ、ダブルスラッシュ(//)で終わる、たTestStringRewriteRule置換に追加スラッシュを含めるべきではありませんので、また、REQUEST_URIサーバー変数は常に、スラッシュで始まります。 Apacheは要求をルーティングするために複数のスラッシュを減らしますが、これらの二重スラッシュはいくつかのサーバー変数(および内部要求)にも存在します。

個人的には、.htaccessに、私はRewriteRuleパターンに後方参照を使用して、スラッシュを続けるだろう。例:

RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f 
RewriteRule (.*) /cache/$1/index.html [L] 
関連する問題