场景:我在同一台IP /机器上指导多个域,并提供依赖于请求/源域的内容。我没有使用基于名称的v-hosts,因为我需要保持代码库的合并,以及其他各种原因。我还需要为这些站点生成站点地图,并单独维护它们。我的困境是我正在尝试使用htaccess将所有* sitemap.xml和* site_index.xml请求重定向到包含请求域名的子文件夹,例如:
http://somedomain.com/sitemap.xml需要指向/var/www/html/sites/somedomain.com/sitemap.xml的本地目录
或http://someotherdomain.com/sitemap.xml需要检索/var/www/html/sites/someotherdomain.com/sitemap.xml
这也必须在不改变地址栏内的地址或重定向搜索机器人等的情况下进行。
我已经考虑将所有* sitemap.xml请求指向脚本以检索并提供所需的数据,但这看起来很麻烦,并不像htaccess指令那样优雅。到目前为止,我已经制作了:
RewriteCond $ 1!=网站 RewriteRule ^([^ /] +)/ sitemap.xml $ sites /%{HTTP_HOST} /sitemap.xml [L]
不会导致错误,也不会产生预期的效果。有什么建议吗?
更新:我能够使用Jacek提供的指令,并稍微改变它们以实现我的目标。这就是我最终的结果:
RewriteRule ^sitemap.xml$ sites/%{HTTP_HOST}/sitemap.xml [L]
答案 0 :(得分:1)
以下是一次处理多个网站的更通用的答案:使用mapfile。
首先,我建议将文件夹命名为所有“合作伙伴”或“网站”,不带扩展名。
创建一个mapfile,您可以将所有“合作伙伴”或“网站”放在没有扩展名的地方:
RewriteMap mappartners \
dbm:/web/htdocs/one_for_all/rewriterules/partners.map
在mapfile中创建简单的条目,如:
somedomain one_for_all/somedomain
someotherdomain one_for_all/someotherdomain
someotherotherdomain one_for_all/someotherotherdomain
...
然后在这里你去寻找困难的部分:
# Make a RewriteCond that fills "%1" with the name of the partner...
RewriteCond %{HTTP_HOST} ^(www\.)?([a-zA-Z0-9\-]+)\.+(fr|com|net|org|eu)$
# ...make a RewriteRule that does nothing but initialize "partner" variable:
RewriteRule (.*) - [QSA,E=PARTNER:${mappartners:%2|notfound}]
# If empty or "notfound"
RewriteCond %{ENV:PARTNER} ^$ [OR]
RewriteCond %{ENV:PARTNER} notfound
# "not found" 404 :
RewriteRule . - [R=404,L]
这样一切都是动态的,但有点复杂。
...并完全重写目的地:
RewriteCond %{DOCUMENT_ROOT}/%{ENV:PARTNER}/%{REQUEST_FILENAME} -f
# File exists => rewrite filename and end rewriterule:
RewriteRule ^(.+) %{DOCUMENT_ROOT}/%{ENV:PARTNER}/%{REQUEST_FILENAME} [QSA,L]
- 作为一个说明,我有一堆像这样的RewriteRules和我的第三个框架(你将在几天后在我未来的网站上看到(http://papdevis.fr))是最快的。
奥利弗
答案 1 :(得分:0)
应该大致工作:
RewriteCond %{HTTP_HOST} !^(.*)$ [NC]
RewriteRule ^sitemap.xml$ %1/sitemap.xml [L]
其中主文件夹中的.htaccess和someotherdomain.com是子文件夹
$ 1等是来自RewriteRule的regexp捕获而%1-type是来自RewriteCond的捕获