情况如下:
我在Amazon S3上有一个静态网站主机。其中的所有文件都是小写字母,例如:file.html
我正在寻找一个脚本/程序/工具来查找S3站点中的所有小写字母文件,并创建几个cased 301重定向。
E.g。创建File.html
和FILE.html
两个文件,并使用新的301重定向功能将大写字母的请求重定向到小写字母真实文件。
请咨询
答案 0 :(得分:2)
我已经整理了一个可以满足您需求的脚本。一切都没有全面,但应该做到这一点。我在https://github.com/mikewirth/s3-caseredirect处将它放在GitHub上。
使用方法:
python makeredirects.py access_code secret bucketname key_for_your_file
我尝试过使用重定向规则功能的版本,但由于大约有20条规则的限制,因此无效。因此,该脚本将创建很多空键。
为了完整性,因为脚本如此之小:
#!/usr/bin/env python
"""
This script takes a file on S3 and creates a redirect from every possible
permutation of case to the original file.
Author: Michael Wirth (https://github.com/mikewirth/s3-caseredirect/)
"""
import sys
import os.path
import argparse
try:
import boto.s3.connection
except:
print "boto library (http://code.google.com/p/boto/) for aws needs to be installed"
sys.exit(1)
filenames = None
def make_case_insensitive(bucket, access, secret, key):
""" Get filename permutations """
global filenames
filenames = []
filename = os.path.basename(key)
path = os.path.dirname(key)
filename_permutations(filename)
connection = boto.s3.connection.S3Connection(access, secret, True)
b = connection.get_bucket(bucket)
for fname in filenames:
if fname == filename:
continue
k = b.new_key(os.path.join(path, fname))
k.set_redirect(key)
def filename_permutations(filename, pos=0):
if len(filename) == pos:
filenames.append(filename)
else:
upper = filename[:pos] + filename[pos:pos+1].upper() + filename[pos+1:]
lower = filename[:pos] + filename[pos:pos+1].lower() + filename[pos+1:]
if upper != lower:
filename_permutations(upper, pos+1)
filename_permutations(lower, pos+1)
else:
filename_permutations(filename, pos+1)
def main():
""" CLI """
parser = argparse.ArgumentParser()
parser.add_argument("access", help="AWS credentials: access code")
parser.add_argument("secret", help="AWS credentials: secret")
parser.add_argument("bucket", help="Name of Amazon S3 bucket")
parser.add_argument("key", help="Name of the key to make available case-insensitively. (Starts with a slash.)")
args = parser.parse_args()
make_case_insensitive(args.bucket, args.access, args.secret, args.key)
if __name__ == "__main__":
main()