情况如下:
我在 Amazon S3 上有一个静态网站主机。其中的所有文件都是小写字母,例如:file.html
我正在寻找一个脚本/程序/工具来查找 S3 站点中的所有小写字母文件并创建几个大小写的 301 重定向。
例如,创建两个文件File.html
并FILE.html
使用新的 301 重定向功能将大写字母的请求重定向到小写字母的真实文件。
请指教
情况如下:
我在 Amazon S3 上有一个静态网站主机。其中的所有文件都是小写字母,例如:file.html
我正在寻找一个脚本/程序/工具来查找 S3 站点中的所有小写字母文件并创建几个大小写的 301 重定向。
例如,创建两个文件File.html
并FILE.html
使用新的 301 重定向功能将大写字母的请求重定向到小写字母的真实文件。
请指教
我已经编写了一个脚本,可以执行您想要的操作。它并不是很全面,但应该可以解决问题。我已经把它放在了 GitHub 的https://github.com/mikewirth/s3-caseredirect上。
用法:
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()