2013-02-03 23 views
1

這裏的情況:在Amazon S3中爲小型封裝文件創建一個套管重定向

我在Amazon S3上有一個靜態網站主機。在它所有的文件都是小寫字母,例如:file.html

我要尋找一個腳本/程序/工具找到一個S3網站的所有小寫字母文件,並創建多個套管301重定向。

E.g.創建File.htmlFILE.html兩個文件,並使用新的301重定向功能將請求以大寫字母重定向到小寫字母真實文件。

請指教

+0

由於S3是大小寫敏感的系統,所以我要看看這個,否則我的網站有太多的404錯誤。隨着文件太多,不斷有更多,所以根本無法做到手動。如果您有其他解決方案讓S3忽略大小寫或不區分大小寫,請諮詢。 –

+1

是從您的網站或通過直接鏈接(例如用戶在URL中輸入內容)進行控制訪問?如果它在您的網站上,您可以僞造一個htaccess重寫規則(例如http://stackoverflow.com/questions/9003486/completely-fake-url-with-htaccess)在調用S3內容之前將請求轉換爲小寫? – Offbeatmammal

+0

Hi @Offbeatmammal,我直接在S3上使用新網站功能託管網站,所以我沒有使用cloudfront。我嘗試搜索,如果S3支持htaccess但沒有運氣 –

回答

2

我已經砍了一個腳本,做你想做的。這種做法並不完善,但應該做到這一點。我把它放在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() 
+0

感謝您的腳本。將嘗試,我希望看到你更加細化它。 –