ローカル開発環境(VirualBox + Ubuntu)において、CSSの変更を再読み込みしない症状で困っています。

ちなみに、Ubuntu を再起動すると再読み込みが行われます。ファイル名を変えても、変更は反映されます。
どうやらファイルが再読み込みされていないことが問題のようです。

なお、ブラウザキャッシュの問題ではないようです。(キャッシュを切って試しました)
勘所がある方がいらっしゃいましたら、改善方法のご教授を宜しくお願いいたします。


# CSS link tag
<link rel="stylesheet" type="text/css" href="/css/test.css?1255501377" />
?以降の数字は、必ず再読み込みさせたいため、timestampを出力

# 参考情報
http://www.ubuntulinux.jp/products/JA-Localized/virtualbox

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2010/01/19 20:43:13
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:TRTr No.6

回答回数52ベストアンサー獲得回数13

ポイント50pt

現状のシステムを維持したままなんとかするには

CSSファイルを更新ではなく

一旦削除 -> 更新したい内容で新規作成/copyするのが有効、ではないでしょうか。

別のディレクトリでマスターを作成しておいて

rm /htdocs/hoge.css

cp hoge.css /htdocs

的なスクリプトを作っておけば比較的簡単かと思います。


ubuntsuの設定をどう変更してもCSSの更新への追従を優先するのであれば

ramfsの設定を変更して、apacheのドキュメントルート以下をramfsでキャッシュしないよう

/etc/initramfs-tools/initramfs.conf

あたりに設定するとよい様に思われます。(試した訳では無いので実際できるかどうか不明です)



以下推測した内容です。

ブラウザのキャッシュを切って再現、pragma:no-cacheも効かない、日付が同一 -> ブラウザのキャッシュではない

Apache再起動で再現 -> Apacheのバッファやモジュールではない

Apacheにmod_proxyやmod_cache、memcachedは入っていない ->HTTPキャッシュではなさそう

 mod_phpではファイルを生成していない -> Apache拡張の問題でも(おそらく)ない

しかしubuntsu再起動で解消

 -> システムのメモリクリアとは同期するのに、アプリのメモリ解放では再現

  -> OSもしくはFW/FS周りの問題


VirtualBox向けUbuntsuでは

/etc/initramfs-tools/initramfs.conf

がデフォルトでは

MODULES=most

に設定されているので、Apacheのドキュメントルート以下がramfsでキャッシュされているのではないか、

と推測しました。

ramfsの機能を切るのはあまりお勧めできませんので

作業的に簡単なのはキャッシュをフラッシュすることで

推測が正しければ目的のファイルを一旦削除することで解消するだろうと考えた次第です。

http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/filesystems/ram...


これで解消するとよいのですが。。。

id:ion10

ご回答ありがとうございます。

また、ご返信が遅れ失礼いたしました。

業務で出ずっぱりで、諸々確認できずにおりました。


> 一旦削除 -> 更新したい内容で新規作成/copyするのが有効、ではないでしょうか。

対応には、取り急ぎ上記案をいただきました。

無事なんとか稼働しております。

ありがとうございました。

2010/01/19 20:39:16

その他の回答5件)

id:ayakasi08 No.1

回答回数172ベストアンサー獲得回数6

ポイント5pt

Apacheのキャッシュを無効にしてみては?

http://www.atmarkit.co.jp/flinux/special/apache22/apache02.html

id:ion10

ご回答ありがとうございます。

ただ、Apache cache モジュールは利用していないようです。

# /usr/sbin/apache2ctl -M

Loaded Modules:

core_module (static)

log_config_module (static)

logio_module (static)

mpm_prefork_module (static)

http_module (static)

so_module (static)

alias_module (shared)

auth_basic_module (shared)

authn_file_module (shared)

authz_default_module (shared)

authz_groupfile_module (shared)

authz_host_module (shared)

authz_user_module (shared)

autoindex_module (shared)

cgi_module (shared)

dir_module (shared)

env_module (shared)

mime_module (shared)

negotiation_module (shared)

php5_module (shared)

rewrite_module (shared)

setenvif_module (shared)

status_module (shared)

2010/01/14 17:00:16
id:horonict No.2

回答回数257ベストアンサー獲得回数51

ポイント25pt

>Ubuntu を再起動すると再読み込みが行われます

これはVirtualBoxを含めての再起動を意味していますか?


いずれにしても、VirtualBoxの仮想NICのキャッシュが怪しいですね。

CSS以外、たとえばHTMLを変更したら、すぐにブラウザに反映されますか?

id:ion10

ご回答ありがとうございます。

また、色々とコメントもありがとうございます。


>これはVirtualBoxを含めての再起動を意味していますか?

いいえ、Ubuntu だけの再起動(VirtualBoxは起動しっぱなし)で問題は解消します。


>いずれにしても、VirtualBoxの仮想NICのキャッシュが怪しいですね。

仮想NICのキャッシュですか…。

なかなか難しそうな問題になりそうですね><

ちなみに、HTTP,SSH でアクセス出来るよう、ポートフォワードの設定は施しています。

設定の参考にしたサイトは、以下のものです。

http://kmnk.blogspot.com/2009/03/osossvn.html


>CSS以外、たとえばHTMLを変更したら、すぐにブラウザに反映されますか?

HTMLの変更は、即座に反映されます。

同一名称で画像を作り替えたりした場合は、再読み込みすることで新しい画像も表示されます。

2010/01/14 18:22:19
id:kick_m No.3

回答回数1372ベストアンサー獲得回数54

ポイント5pt

ブラウザキャッシュの問題ですね。残念ながら。

id:ion10

ブラウザキャッシュの問題であれば、正直うれしいのですが。。。

解決策の心当たりがあれば、ご教授頂ければと思います。

2010/01/15 10:17:28
id:horonict No.4

回答回数257ベストアンサー獲得回数51

ポイント20pt

"httpd.conf" に "ExpiresByType text/css" が設定されていませんか?

http://httpd.apache.org/docs/2.2/ja/mod/mod_expires.html

id:ion10

度々のご回答ありがとうございます。

早速、ご指摘の点を確認してみました。


調べたところ、mod_expires は、利用していないようでした。

ただ事象は解決しなかったものの、ApacheでデフォルトのCache期間を指定出来ることを初めて知り、勉強にはなりましたw

情報のご提供ありがとうございます。

2010/01/15 11:39:27
id:niwa-mikiho No.5

回答回数516ベストアンサー獲得回数40

ポイント5pt

ブラウザのキャッシュ無視のリロード

IE なら CTRL + リロードボタン

Firefox なら Shift + リロードボタン

するとどうでしょう?


あと、HTML に

<meta http-equiv="Cache-Control" content="no-cache">

<meta http-equiv="Expires" content="Fri, 03 JUL 1992 00:00:00 GMT">

を挿入したり、

HTML をスクリプトなどで吐き出してるのであれば、

print "Pragma: no-cache\n"; } # ← HTTP 1.0

print "Cache-Control: no-cache\n";} # ← HTTP 1.1

のように、キャッシュしないように HTTP ヘッダに付けてみるとどうでしょう?

id:ion10

ご回答ありがとうございます。

やはりブラウザキャッシュ周りが怪しそうなんですね。

今後は重点的に探ってみようと思います。

以下に、ご回答に対しコメントさせていただきます。


> ブラウザのキャッシュ無視のリロード

CSSの更新は反映されません。


> あと、HTML に

> <meta http-equiv="Cache-Control" content="no-cache">

> <meta http-equiv="Expires" content="Fri, 03 JUL 1992 00:00:00 GMT">

> を挿入したり、

HTMLは上記と似たような形で記載しております。


<meta http-equiv="Pragma" content="no-cache" />

<meta http-equiv="Cache-Control" content="no-cache" />

<meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GM" />

2010/01/15 13:40:55
id:TRTr No.6

回答回数52ベストアンサー獲得回数13ここでベストアンサー

ポイント50pt

現状のシステムを維持したままなんとかするには

CSSファイルを更新ではなく

一旦削除 -> 更新したい内容で新規作成/copyするのが有効、ではないでしょうか。

別のディレクトリでマスターを作成しておいて

rm /htdocs/hoge.css

cp hoge.css /htdocs

的なスクリプトを作っておけば比較的簡単かと思います。


ubuntsuの設定をどう変更してもCSSの更新への追従を優先するのであれば

ramfsの設定を変更して、apacheのドキュメントルート以下をramfsでキャッシュしないよう

/etc/initramfs-tools/initramfs.conf

あたりに設定するとよい様に思われます。(試した訳では無いので実際できるかどうか不明です)



以下推測した内容です。

ブラウザのキャッシュを切って再現、pragma:no-cacheも効かない、日付が同一 -> ブラウザのキャッシュではない

Apache再起動で再現 -> Apacheのバッファやモジュールではない

Apacheにmod_proxyやmod_cache、memcachedは入っていない ->HTTPキャッシュではなさそう

 mod_phpではファイルを生成していない -> Apache拡張の問題でも(おそらく)ない

しかしubuntsu再起動で解消

 -> システムのメモリクリアとは同期するのに、アプリのメモリ解放では再現

  -> OSもしくはFW/FS周りの問題


VirtualBox向けUbuntsuでは

/etc/initramfs-tools/initramfs.conf

がデフォルトでは

MODULES=most

に設定されているので、Apacheのドキュメントルート以下がramfsでキャッシュされているのではないか、

と推測しました。

ramfsの機能を切るのはあまりお勧めできませんので

作業的に簡単なのはキャッシュをフラッシュすることで

推測が正しければ目的のファイルを一旦削除することで解消するだろうと考えた次第です。

http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/filesystems/ram...


これで解消するとよいのですが。。。

id:ion10

ご回答ありがとうございます。

また、ご返信が遅れ失礼いたしました。

業務で出ずっぱりで、諸々確認できずにおりました。


> 一旦削除 -> 更新したい内容で新規作成/copyするのが有効、ではないでしょうか。

対応には、取り急ぎ上記案をいただきました。

無事なんとか稼働しております。

ありがとうございました。

2010/01/19 20:39:16
  • id:horonict
    以下の点をご確認願います。
    1)ブラウザはFireFoxですか? バージョンは幾つですか?
    2)FireFoxに何かアドオンを搭載していませんか?
    3)FireFoxで該当ページを「再読み込み」させたときの動作はどうですか?
    4)FireFoxを一度終了してから(Ubuntuを再起動させることなく)、再びFireFoxを起動した時の動作はどうですか?
  • id:ion10
    > horonict 様
    コメントありがとうございます。
    以下ご回答させて頂きます。

    1)ブラウザはFireFoxですか? バージョンは幾つですか?
    Firefox 3.5.7 です。

    2)FireFoxに何かアドオンを搭載していませんか?
    アドオンはたっぷり搭載しています。

    3)FireFoxで該当ページを「再読み込み」させたときの動作はどうですか?
    CSSの変更が反映されません。

    4)FireFoxを一度終了してから(Ubuntuを再起動させることなく)、再びFireFoxを起動した時の動作はどうですか?
    CSSの変更が反映されません。


    ※補足1
    IE8, Chrome3.0.195.38 でも「再読み込み」「再起動」を試してみました。
    どちらのケースでも、CSSの変更が反映されませんでした。

    ※補足2
    アドオンを全て無効にして、「再読み込み」「再起動」を試してみました。
    残念ながら、CSSの変更が反映されませんでした。
  • id:horonict
    Ubuntu用IE8は存在しないはずですが、
    「ローカル開発環境」というのはVirualBox + Ubuntuの上にWebサーバを立てて、
    同じマシンのWindowsからブラウザで見に行こうとしていますか?
    そうだとすると、Windows, VirtualBox, Ubuntoの種類、およびWebサーバの種類/バージョンを教えてください。
  • id:fut573
    スクリプト側でサーバーにキャッシュを生成しているというオチはないでしょうか?
  • id:ion10
    > horonict 様
    コメントありがとうございます。


    > 「ローカル開発環境」というのはVirualBox + Ubuntuの上にWebサーバを立てて、
    > 同じマシンのWindowsからブラウザで見に行こうとしていますか?

    仰る通りです。
    説明が足りず、失礼いたしました。


    > そうだとすると、Windows, VirtualBox, Ubuntoの種類、およびWebサーバの種類/バージョンを教えてください。

    Windows : XP Professional SP3
    VirtualBox : 2.2.4
    Ubuntu : 8.04
    Webサーバの種類 : Apache/2.2.8 (Ubuntu)

    となります。
    何か気になる点はありますでしょうか?
  • id:ion10
    > fut573 様
    コメントありがとうございます。

    スクリプトを使わない、素の HTML&CSS で何度か試したのですが、事象は再現してしまっております。
    このためHatenaで質問させて頂きました。
  • id:TRTr
    CSSはPHP等で生成しているのでしょうか?
    そのときは
    http://blog.suz-lab.com/2007/07/phphttp.html
    が役に立ちそうです。
    ただ、キャッシュしないCSSはWebサイトとしてあまり望ましい構造ではないのですが...
    もしくは.cssにaddhandlerで何か追加していないでしょうか?

    Ubuntsuの再起動では同時にApacheやFSも再起動されています。
    Apacheの再起動(apachectl graceful)でも更新前のCSSが読み込まれるでしょうか?

    また、素のCSSで試した際、
    CSSのページを直接読み、ブラウザのページ情報で見たときに
    いつのタイムスタンプが見えるでしょうか?
    FirefoxでcssのURLを指定して開き、
    Ctrl+Shift+Rでスーパーリロードをかけても古い物が表示されるでしょうか?

    どこかがキャッシュしているのは間違いないのですが
    現状では十分な判断材料が揃っていないように思います。

    firefoxのAdd-onでLive HTTP headersをいれて
    https://addons.mozilla.org/ja/firefox/addon/3829
    HTTPヘッダをみてCache-Control: がいくつになっているか等Apache側で調査すべきことと、
    UbuntsuのFSをどのようにしているのかが主な調査すべき内容です。
    CSSとHTMLでCache-Controlが違う値になっているような気がしますが
    もう少し調べてみてはいただけないでしょうか?

  • id:ion10
    > TRTr 様
    コメントありがとうございます。
    非常に参考になり、色々と試してみました。
    以下、試行した内容を記載させて頂ます。


    >CSSはPHP等で生成しているのでしょうか?

    PHPで生成しているわけではありません。
    しかしながら
    <link rel="stylesheet" type="text/css" href="/css/import.css?1262862637" />
    の"?"以降の部分は、PHPにて自動付与するように実装してございます。


    >もしくは.cssにaddhandlerで何か追加していないでしょうか?

    AddHandler は利用しておりません。


    >Apacheの再起動(apachectl graceful)でも更新前のCSSが読み込まれるでしょうか?

    Apache の再起動後も、更新前のCSSが読み込まれた状態です。


    >どこかがキャッシュしているのは間違いないのですが
    >現状では十分な判断材料が揃っていないように思います。

    仰る通りだと、私も考えております。
    ただ、どの部分かが問題ですよね。


    >HTTPヘッダをみてCache-Control: がいくつになっているか等Apache側で調査すべきこと
    >CSSとHTMLでCache-Controlが違う値になっているような気がしますが

    確かに Cache-Control の値に、違いがございました。
    CSS側に「no-cache」指定等が無いことが問題のようですね。
    no-cache の header 情報を送信するなり、対応を進めてみようと思います。


    # CSS
    Cache-Control: max-age=0

    # HTML
    Cache-Control: max-age=0
    Cache-Control: private
    Pragma: no-cache



    ■CSS更新前後の HTTP Header
    ついでに、更新前後の HTTP Header の内容を見比べておりました。
    適切に、Last-Modified が更新されているように見えております。


    # 更新前
    http://localhost:18080/css/base.css

    GET /css/base.css HTTP/1.1
    Host: localhost:18080
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 (.NET CLR 3.5.30729)
    Accept: text/css,*/*;q=0.1
    Accept-Language: ja,en-us;q=0.7,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://localhost:18080/css/import.css?1262862637
    If-Modified-Since: Thu, 07 Jan 2010 11:10:37 GMT
    If-None-Match: "427-ae9-47c911ee0e540"
    Cache-Control: max-age=0

    HTTP/1.x 200 OK
    Date: Fri, 15 Jan 2010 02:59:21 GMT
    Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
    Last-Modified: Fri, 15 Jan 2010 02:59:10 GMT
    Etag: "427-aeb-47d2b300bfb80"
    Accept-Ranges: bytes
    Content-Length: 2795
    Keep-Alive: timeout=15, max=99
    Connection: Keep-Alive
    Content-Type: text/css


    # 更新後
    http://localhost:18080/css/base.css

    GET /css/base.css HTTP/1.1
    Host: localhost:18080
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 (.NET CLR 3.5.30729)
    Accept: text/css,*/*;q=0.1
    Accept-Language: ja,en-us;q=0.7,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://localhost:18080/css/import.css?1262862637
    If-Modified-Since: Thu, 07 Jan 2010 11:10:37 GMT
    If-None-Match: "427-ae9-47c911ee0e540"
    Cache-Control: max-age=0

    HTTP/1.x 200 OK
    Date: Fri, 15 Jan 2010 02:59:21 GMT
    Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
    Last-Modified: Fri, 15 Jan 2010 02:59:10 GMT
    Etag: "427-aeb-47d2b300bfb80"
    Accept-Ranges: bytes
    Content-Length: 2795
    Keep-Alive: timeout=15, max=99
    Connection: Keep-Alive
    Content-Type: text/css



    >UbuntsuのFSをどのようにしているのかが主な調査すべき内容です。

    あまり勘所が無いため、まずはファイルシステムの状況を把握するところから進めております。
    以下に現状を記載させていただきます。


    root@ubuntu-vbox:/mnt/share/njss/njss4.2.2/webroot/css# cat /proc/filesystems
    nodev sysfs
    nodev rootfs
    nodev bdev
    nodev proc
    nodev cgroup
    nodev cpuset
    nodev debugfs
    nodev securityfs
    nodev sockfs
    nodev pipefs
    nodev anon_inodefs
    nodev futexfs
    nodev tmpfs
    nodev inotifyfs
    nodev devpts
    cramfs
    nodev ramfs
    nodev mqueue
    nodev fuse
    fuseblk
    nodev fusectl
    nodev usbfs
    ext3
    nodev vboxsf


    root@ubuntu-vbox:/mnt/share/njss/njss4.2.2/webroot/css# cat /etc/fstab
    # /etc/fstab: static file system information.
    #
    # <file system> <mount point> <type> <options> <dump> <pass>
    proc /proc proc defaults 0 0
    # /dev/sda1
    UUID=76251a93-fe9b-4f78-b8b4-707633673c4e / ext3 relatime,errors=remount-ro 0 1
    # /dev/sda5
    UUID=25d41a74-4f2f-4f00-8f65-0c112b282117 none swap sw 0 0
    /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0
    /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0




    >また、素のCSSで試した際

    まずはCSSに対する「Pragma: no-cache」などの指定を試しますが、
    追って試してみようと思います。
  • id:ion10
    自己レスです。
    皆さんから頂いた知恵を元に、「ブラウザキャッシュがやはり怪しい」とあたりをつけ、
    CSS がキャッシュされないように指定し、試してみました。


    ■no-cache の指定を CSS に

    ・.htaccess を利用して、以下の要領でCSSディレクトリに対してキャッシュOFFを指定
    <Files ~ "\.css$">
    Header set Pragma no-cache
    Header set Cache-Control no-cache
    Header set Expires "Sun, 11 May 2008 00:00:00 GMT"
    </Files>


    ・予定通りの HTTP Header が送出されているか確認
    $ curl -IG http://localhost/css/footer.css
    HTTP/1.1 200 OK
    Date: Fri, 15 Jan 2010 07:02:16 GMT
    Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
    Last-Modified: Fri, 15 Jan 2010 06:40:33 GMT
    ETag: "6-988-47d2e47c67a40"
    Accept-Ranges: bytes
    Content-Length: 2440
    Pragma: no-cache
    Cache-Control: no-cache
    Expires: Sun, 11 May 2008 00:00:00 GMT
    Content-Type: text/css


    ・Live HTTP Header でも確認
    http://localhost:18080/css/footer.css

    GET /css/footer.css HTTP/1.1
    Host: localhost:18080
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 (.NET CLR 3.5.30729)
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ja,en-us;q=0.7,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache

    HTTP/1.x 200 OK
    Date: Fri, 15 Jan 2010 07:09:16 GMT
    Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
    Last-Modified: Fri, 15 Jan 2010 07:02:37 GMT
    Etag: "6-989-47d2e96b11d40"
    Accept-Ranges: bytes
    Content-Length: 2441
    Pragma: no-cache
    Cache-Control: no-cache
    Expires: Sun, 11 May 2008 00:00:00 GMT
    Keep-Alive: timeout=15, max=100
    Connection: Keep-Alive
    Content-Type: text/css


    ・CSSの更新が反映されるかを確認
    ダメでした。。。ちょっとお手上げモードです。
    さて、どうしたものでしょうか?
  • id:uomi41
    けっこう昔の記事なので今更感はありますが、この問題に関してほかに日本語の情報を見つけられなかったので念のため書いておきます。

    Virtualbox7.0.1+CentOS6という環境で、おそらく同じ問題で困っていたのですが、
    下記の記事の方法で解決できました。
    http://cantuse.it/2009/01/virtualbox-apache2-strange-caching-issues/

    具体的には以下のように設定することで解消できました。
    <Directory /media/sf_workspace>
    EnableMMAP Off
    EnableSendfile Off
    </Directory>

    Apacheの静的ファイルをメモリ上にキャッシュする機能が原因だったようです。
    通常、キャッシュされたファイルが更新された場合、更新を検知して再読み込みを行うはずですが、
    NFS、SMBなどの外部ストレージ上のファイルは正しく更新を検知できないようです。

    ■参考 EnableMMAP、EnableSendfileディレクティブ
    http://httpd.apache.org/docs/2.0/ja/mod/core.html

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません