我在我的Django生成的sitemap.xml文件中放置了静态视图和模型视图,但我不知道如何告诉Django将所有媒体文件放入其中?我有一百个带有seo友好链接的PDF文件,我希望它们在我的sitemap.xml中,但由于它们与我的任何模型都不相关,我不知道如何管理它?
编辑:我几乎忘记了一件重要的事情 - 我的媒体(pdf)文件是通过CloudFront提供的,所以即使我以某种方式管理它在我的Django Sitemap.xml中列出它我还会有其他问题,因为他们有&# 39; something.cloudfront.com'在他们的网址中,而不是在我的网站上的网址' 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
答案 0 :(得分:1)
您不允许在站点地图中使用外部网址(或者更确切地说,他们不会将Google所需的效果作为您网站内容的一部分进行索引)。
我认为您最好的选择是在您的网站上专门设置一个路径,例如/hosted/pdf/xxxx.pdf
,使用mod_rewrite / location patterns / regex将所有内容重写为cloudfront.com/pdf/xxxx.pdf
或类似内容。
通过这种方式,您可以在站点地图中使用本地站点网址,但仍然可以将浏览器直接发送到云端服务内容,我认为这甚至可以很好地利用302 HTTP状态代码。
在Sitemap
类中有一个items()
方法,它返回sitemap.xml中包含的内容,您可以创建自己的类来扩展它并添加其他数据。
您可以手动添加方法中硬编码的数据,但我认为首选选项是创建一个表示每个远程托管文件的模型,并包含在站点地图中输出它所需的信息。 (这也允许您在每个文件的基础上添加可见性等属性,并允许您通过管理员管理它,假设您为它设置了ModelAdmin。)
我认为您可以使用BlogSitemap
扩展Sitemap
的类来执行与http://docs.djangoproject.com/en/1.9/ref/contrib/sitemaps中显示的内容类似的操作。请务必查看标题" Sitemap以获取静态视图"也在那个页面上。
我的建议是您选择了模型方法来表示文件,因此您将托管的PDF(或其他CDN内容)作为名为StaticHostedFile
或类似的模型进行迭代,并在{ {1}}部分。它确实需要您索引所有当前PDF以为它们创建模型,并在添加新PDF时创建新模型(但这可以自动化)。
知道你可以添加"包括"在sitemap.xml中,您可以将站点内容拆分为两个站点地图(内容+ pdf),并将它们包含在sitemap.xml中,例如:
items()
这仍然需要本地URL和重写,但是当你有几个单独的站点地图要结合时,它可能是一个很好的技巧。 (例如,如果在一个子目录下运行Django站点,在另一个子目录下运行Wordpress站点,或者等等。)