我已經把靜態視圖和模型視圖放在Django生成的sitemap.xml文件中,但我不知道如何告訴Django將所有媒體文件放入它中?我有一百個帶有seo友好鏈接的PDF文件,我希望它們位於我的sitemap.xml中,但是因爲它們與我的任何模型都不相關,所以我不知道如何管理它?如何告訴Django將sitemap.xml中的媒體(pdf)文件URL?
編輯︰我幾乎忘了一件重要的事情 - 我的媒體(pdf)文件通過CloudFront服務,所以即使我管理某種方式列出他們在我的Django Sitemap.xml我會有更多的問題,因爲他們有'的東西。 cloudfront.com'在他們的網址,而不是在我的網站的網址'example.com'。 這甚至有可能解決?這如何反映在搜索引擎優化?
求助: @kb,謝謝你的一個很好的答案!正如你在答案的第一部分中所建議的那樣,我在我的htaccess中使用了RewriteRule,並且它工作正常。 作爲第二部分的,而不是爲我的媒體文件創建模型(這會工作得很好,但唯一不足的是人工添加的每個新的PDF文件) 我決定將一些行添加到我的項目()方法,這樣我就可以列出桶內容和過濾PDF文件。隨着我可以有我所有的文件跟上時代的一切的時候,很容易:
#sitemap.py
import boto
from boto.s3.key import Key
from boto.s3.connection import S3Connection
import re
def items(self):
AWS_ACCESS_KEY_ID = #'my_access_key_number'
AWS_SECRET_ACCESS_KEY = #'my_secret_access_key'
Bucketname = #'my_bucket_name'
conn = boto.s3.connect_to_region('eu-central-1', aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat())
bucket = conn.get_bucket(Bucketname)
new_list = []
regex = re.compile(r'bucketsubfolder/media.*\.pdf$', re.I) #i hold my media files in bucketsubfolder so url is for example somedomain.cloudfront.net/bucketsubfolder/media/somefile.pdf
for item in bucket.list():
if regex.match(item.name):
new_list.append(item.name)
return new_list
您不允許在站點地圖中使用外部URL(或者說,它們不會產生所需的效果)。我認爲你最好的選擇是在你的網站上創建一個類似'/ hosted/pdf/xxxx.pdf'的路徑,使用重寫/位置模式重定向到'cloudfront.com/pdf/xxxx.pdf'或類似的路徑。這樣,您可以在站點地圖中使用站點URL,但仍然可以直接將瀏覽器發送到雲端服務內容。 –
好吧,我認爲這可以幫助解決1/2的問題。你有什麼想法如何以編程方式在django站點地圖中包含PDF? –
恐怕我已經很長時間沒有做過Django了,但是基本上應該在Sitemap類中有一個'items()'來返回內容,所以你想在返回之前手動添加東西到列表中。我認爲你可以像在https://docs.djangoproject.com/en/1.9/ref/contrib/sitemaps/中顯示的內容一樣,通過像'BlogSitemap'類一樣擴展'Sitemap'來做類似的事情。 (也請查看標題#sitemap-for-static-views。) –