2012-04-02 91 views
0

我有这个应用程序,我想支持多种语言。 我想最简单的方法是使用子域名又名mod_rewrite保留URL中的子域名

http://fr.domain.com/content 

现在我创造了我的服务器上的子域,指向主要根源,实际上,上面的URL访问。
现在的问题是我所有的链接,这是绝对的。
mod_rewrite是否有办法从URL中捕获语言,并将链接重写为相同的子域URL?

所以,如果我们对http://fr.domain.com/content并点击链接http://domain.com/link我想要的页面加载作为http://fr.domain.com/link

这可能吗? 干杯!

回答

5

如果你想通过apache来完成,你可能需要检查HTTP_REFERER。这可能是好的开始更新网站,这样的链接是在未来的动态...

喜欢的东西(我真的不能测试目前此):

RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_HOST} !^[a-z]{2}\.host\.com$ [NC] 
RewriteCond %{HTTP_REFERER} ^http://([a-z]{2})\.host.com/.*$ [NC] 
RewriteRule (.*) http://%1.host.com/$1 [R,L,QSA] 

编辑:删除一个NOT在第三种情况下

您可能需要检查一些其他条件,但是要测试一下才能找出有效的方法。此外,如果您进行其他重定向,则需要维护原始引荐来源的方法。在某些方面,即使这些链接是他们的方式,通过使用php(通过会话)或其他方式更动态的方式来做到这一点可能会更容易。

我使用这些:

http://www.askapache.com/htaccess/mod_rewrite-variables-cheatsheet.html#HTTP_REFERER

http://www.askapache.com/htaccess/modrewrite-tips-tricks.html

+1

我同意您可能想要更新网站以在链接发送到浏览器之前更改链接。如果您只处理GET,上面的解决方案将工作,但如果您有POST请求的绝对链接,则mod_rewrite不是解决此问题的适当工具。 – Jamey 2012-04-11 13:51:48

+0

是的。也许它应该是“P”标志而不是“L”标志来保存发布数据。 (假设代理模块已启用) – craniumonempty 2012-04-11 13:58:15

+0

哦,我..我完全忘了我的问题。对不起,那头颅骨是空的。我看到你只得到了一半的赏金。我很抱歉。您的解决方案很好。唯一可以接受的是我希望将英语作为默认语言。我有一个类似'href =“it.domain.com”等链接的语言切换。英文切换有一个正常的'href =“domain.com”',当然,当我们在例如法文页面fr .domain.com'引用者仍然保留法文sub。有没有解决方案? – FFish 2012-04-16 07:07:23

2

你也许需要某种对即时HTML重写的工具,像mod_proxy_html。此工具专门用于重写反向代理另一端页面中的链接,但应该可以将其用于通用链接重写。特别是文档说:

通常情况下,mod_proxy_html将拒绝运行,而不是在代理或内容不是HTML。这可以通过设置环境变量PROXY_HTML_FORCE(例如使用SetEnv指令)来覆盖(风险自负)。

该模块是相当可配置的,支持条件重写和正则表达式,所以一些调整它应该做你想做的。

2

所以你说你的网站有链接像<a href="http://domain.com/link">而不是只是<a href="/link"> ???你的链接编码是否有某些原因?

您会喜欢掀起一个文本编辑器和搜索/替换这些hrefs而不是做一些典型的或过分复杂的URL重写吗?

+0

真的,我不能这样做,因为这是CMS如何编写链接.. – FFish 2012-04-16 07:17:47

+0

您使用的是什么CMS?如果它是开源的,那么修改/修复CMS软件以编写正确的URL会更容易。 – 2012-04-18 21:06:44