2012-04-02 42 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