【发布时间】:2016-07-07 16:36:52
【问题描述】:
我已将静态视图和模型视图放入 Django 生成的 sitemap.xml 文件中,但我不知道如何告诉 Django 将所有媒体文件放入其中?我有一百个带有 seo 友好链接的 PDF 文件,我希望它们在我的 sitemap.xml 中,但由于它们与我的任何模型都不相关,我不知道如何管理它?
编辑:我几乎忘记了一件重要的事情 - 我的媒体 (pdf) 文件是通过 CloudFront 提供的,所以即使我设法在我的 Django Sitemap.xml 中列出它们,我也会遇到其他问题,因为它们有 'something.cloudfront .com' 在他们的 url 中,而不是在我的网站的 url 'example.com' 中。 这甚至可以解决吗?这对 SEO 有何影响?
已解决: @kb,感谢您的出色回答!正如您在答案的第一部分中建议的那样,我已经在我的 htaccess 中使用了 RewriteRule,它工作正常。 从第二部分开始,而不是为我的媒体文件创建模型(这可以正常工作,但唯一的缺点是手动添加每个新的 pdf 文件) 我决定在我的 items() 方法中添加一些行,以便我可以列出存储桶内容并过滤 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
【问题讨论】:
-
您不能在站点地图中使用外部网址(或者更确切地说,它们不会产生预期的效果)。我认为你最好的选择是在你的网站上创建一个路径,比如
/hosted/pdf/xxxx.pdf,使用重写/位置模式重定向到cloudfront.com/pdf/xxxx.pdf或类似的路径。这样,您可以在站点地图中使用站点 URL,但仍将浏览器直接发送到云端提供的内容。 -
好的,我认为这会有所帮助,解决了 1/2 的问题。您知道如何以编程方式在 django 站点地图中包含 PDF 吗?
-
恐怕我很久没做过Django了,但本质上应该在Sitemap类中有一个
items()来返回内容,所以你想手动添加一些东西在返回之前列出。我认为你可以通过扩展Sitemap来做类似于他们在docs.djangoproject.com/en/1.9/ref/contrib/sitemaps 中显示的事情,就像他们对BlogSitemap类所做的那样。 (检查标题#sitemap-for-static-views。) -
你说得对,这是可能的,但唯一的缺点是我必须手动添加它们。谢谢你的帮助
-
@kb 我已经用一种不同的方法成功地完成了这项任务,所以请在上面写下你的建议的答案,这样我就可以接受它并给你赏金。谢谢!