Como posso configurar o apache para impedir que servidores proxy armazenem em cache uma URL específica em meu site?

2

Eu tenho um repositório clickonce hospedado em um servidor Apache; por razões óbvias *, eu não quero que este repositório seja armazenado em cache por um servidor proxy.

Sei que não há como impedir que um proxy armazene em cache algo se quiser, mas estou procurando uma maneira de sugerir ao proxy que ele não armazene em cache minha URL ou forneça uma "data de obsolescência".

Existe uma maneira de fazer isso com o Apache? Se não, é possível fazer isso com outro servidor web (IIS?)

Se houver algumas opções trabalhando apenas com alguns fornecedores de proxy específicos, estou interessado nelas também.

** Se o repositório for armazenado em cache, o software verifica sua versão em uma cópia obsoleta da "versão mais recente" (mantida pelo proxy) em vez de verificar-se contra a versão mais recente "real", que está no meu servidor.

    
por Brann 05.05.2009 / 16:33

4 respostas

7

Isso é muito fácil de fazer com o apache, por exemplo, para especificar que nada vindo do seu servidor deve ser sempre armazenado em cache, tente isso

<Location / >
   ExpiresActive On
   ExpiresDefault "now"
</Location>

Você provavelmente não quer fazer isso exatamente, então veja a documentação para mod_expires e personalize isso para suas necessidades.

Além disso, lembre-se de que, nesse cenário, um navegador e um proxy são tratados da mesma maneira. Ao enviar cabeçalhos de expiração com suas respostas que desativam o cache, você estará adicionando carga e custo significantes à execução do seu site, sem mencionar o abrandamento do acesso de seus visitantes.

    
por 05.05.2009 / 16:54
2

Se você estiver falando de algum tipo de mecanismo de cache, como um acelerador de WAN, e o dispositivo em questão anexar um UserAgent distinto à solicitação, você está com sorte. Nesse caso, você pode ter regras como as seguintes, em que SomeString é a string que corresponderá ao agente do usuário do mecanismo de cache:

BrowserMatch SomeString no-cache-headers
Header set Cache-Control "no-cache, must-revalidate"    env=no-cache-headers
Header set Pragma        "no-cache"                     env=no-cache-headers
Header set Expires       "Sat, 1 Jan 2000 00:00:00 GMT" env=no-cache-headers

Aqui, defini o cabeçalho "Expires" para uma data arbitrária no passado.

Se você está falando de um proxy que apenas encaminha a solicitação e não faz a solicitação sozinho, o máximo que você pode fazer é evitar todo o armazenamento em cache desses objetos, ou (um pouco melhor) definir um curto tempo de vida para esses objetos. Você poderia fazer isso com algo assim:

ExpiresActive On
ExpiresDefault "access plus 1 hour"

onde você pode escolher a hora que quiser. Ou você pode simplesmente fornecer "acesso" conforme o padrão de expiração, o que significa que a próxima solicitação deve receber um novo objeto. Mas aqui, como outros salientam, você também está penalizando navegadores.

    
por 05.05.2009 / 17:31
1

Você pode definir a meta tag "Expires" em suas páginas HTML ou definir um / vários cabeçalhos através do servidor Apache / whatever. Aqui estão algumas informações realmente boas sobre o assunto.

Aqui está como fazê-lo usando ASP no IIS .

Usando cabeçalhos, basicamente você pode definir o max-age como 1 segundo, por exemplo, e o sem cache , sem armazenar , e deve-revalidar cabeçalhos, por uma boa medida, porque existem alguns proxies com problemas / bugs, e assim você deve cobrir todas as bases.

    
por 05.05.2009 / 16:48
0

Com o Apache, você vai querer examinar mod_expires . A maioria dos proxies respeita o cabeçalho HTTP Expires juntamente com max-age, etc.

    
por 05.05.2009 / 16:51