Я просто поделюсь своим решением, которое расширяет код Ричарда в полное решение.
Если URL-адрес содержит заглавные буквы, мы перенаправляем пользователя на правильный URL-адрес, вместо того, чтобы просто нормализовать URL-адрес перед вводомкеш машины.Это не позволяет поисковым системам индексировать 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
}
При преобразовании req.url
в нижний регистр происходит уродливое приведение от const char *
к char *
...мы модифицируем строку на месте, несмотря на то, что Varnish говорит нам не делать этого.Вроде работает.: -)