리차드의 코드를 완전한 솔루션으로 확장하는 솔루션 만 공유합니다.
URL에 대문자가 포함되어있는 경우 캐시 기계에 들어가기 전에 URL을 정규화하는 대신 사용자를 올바른 URL로 리디렉션합니다. 이렇게하면 검색 엔진이 대소 문자가 혼용 된 URL을 소문자로 구분할 수 없습니다. 하지에 우리에게 말하고 니스에도 불구하고 기본적으로, 우리는 현재 위치에서 문자열을 수정하고 ... 소문자를하는 req.url
을 변환 할 때
# Define a function that converts a string to lower-case in-place.
# http://stackoverflow.com/questions/6857445
C{
#include <ctype.h>
static void strtolower(char *c) {
for (; *c; c++) {
if (isupper(*c)) {
*c = tolower(*c);
}
}
}
}C
sub vcl_recv {
if (req.http.host ~ "[A-Z]" || req.url ~ "[A-Z]") {
# Convert host and path to lowercase in-place.
C{
strtolower(VRT_GetHdr(sp, HDR_REQ, "\005host:"));
strtolower((char *)VRT_r_req_url(sp));
}C
# Use req.http.location as a scratch register; any header will do.
set req.http.location = "http://" req.http.host req.url;
error 999 req.http.location;
}
# Fall-through to default
}
sub vcl_error {
# Check for redirects - redirects are performed using: error 999 "http://target-url/"
# Thus we piggyback the redirect target in the error response variable.
if (obj.status == 999) {
set obj.http.location = obj.response;
set obj.status = 301;
set obj.response = "Moved permanently";
return(deliver);
}
# Fall-through to default
}
는 const char *
에서 char *
에 못생긴 캐스트있다. 작동하는 것 같습니다. 도 :-) C 블록의 URL을 설정하고 않도록 충돌 사용하는
이것은 Varnish 4.0에서만 사용할 수 있다고 생각했지만 v3.0 (https://www.varnish-cache.org/docs/3.0/reference/vmod_std.html#tolower)에있는 것 같습니다. 내가 그걸 알았 으면 좋겠어. –
Enter 키를 누르 자마자 Firefox 44와 Chrome 48 둘 다 호스트 요청 헤더를 소문자로 표시합니다. 호스트의 tolower()가 더 이상 필요하지 않다는 것을 완전히 확신하지 못합니다. 나는 그것이 상처를주지 않는다고 생각한다. –
Varnish docs는 호스트가 작은 브라우저를 확인합니다. "Varnish는"Varnish.org/ "및"varnish.org/ "를 사용하면 캐시 항목이 달라지기 때문에 해시하기 전에 바니시가 호스트 이름이나 URL을 소문자로 처리하지 않는 것이 좋습니다. 그러나 브라우저는 소문자를 사용하는 경향이 있습니다 호스트 이름. " - https://www.varnish-cache.org/docs/trunk/users-guide/vcl-hashing.html –