2011-10-21 22 views
1

我服務使用Apache的文件和應用程序的請求,App請求使用RewriteRule發送模式相匹配,以我的應用程序服務器的網址。如何使用Apache中的現有文件只設置HTTP標頭的conf

我希望設置一個特定的HTTP報頭(緩存控制)僅適用於不從上述匹配RewriteConds請求。有沒有辦法做到這一點,而不使用.htaccess文件?

我試過在RewriteRule(它使用L標誌)之後放置Header set指令,但標題仍然得到應用。

回答

1

你真的應該張貼您的RewriteRules。

有肯定是我們可以做到這一點。首先我在想的是設置一個環境變量來匹配rewriteRules(所以一組rewriteCond,反轉以前的),使用[E=myvar:myvalue]標籤;並使用Header指令[env=myvar]的最後一個可用參數來條件設置此Header。

然後你說:

有沒有這樣做,沒有使用.htaccess文件的方法嗎?

那麼,RewriteRules和.htaccess文件是鬆散相關的。你在的.htaccess設置任何真的適合在<Directory>指令更好地與您的虛擬主機,以防止來自Apache的IO操作的looooot一個不錯的AllowOverride None,試圖在每個請求讀了一堆的.htaccess文件。

第二件事,你說:

我試過把頁眉設置指令重寫規則的 (它使用了L位)

好後的[L]標誌防止幾個的RewriteRules一個接一個地應用相同的目錄,所以他們現在不會被鏈接到direclty。但事實上,在你的rewriteRule結束之後([L]),rewriteRule的輸出將重新應用到目錄中,以查看是否仍應用任何RewriteRule(也許是同一個)。

這就是爲什麼我們有時會看到太多的內部重定向消息。

要想看到它發生的唯一方法是在VirtualHost上使用RewriteLog /a/file.logRewriteLogLevel 9(有時會出現很多驚喜,有些規則有時會伴隨大量遞歸)。

一個很好的的RewriteCond已知的是:

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 

這種的RewriteCond任何前綴規則將僅應用於您進入該目錄最早出現的時候,你的規則結束後(也許用[L]或者因爲沒有更多規則),結果將在直接規則中重新測試,但env變量REDIRECT_STATUS不爲空。如果設置了此env變量,此條件會告訴mod-rewrite以避免該規則。

相關問題