簡體   English   中英

Apache RewriteCond 不適用於 static 文件

[英]Apache RewriteCond not working for static files

我在不同語言(西班牙語和英語)的不同目錄中有兩個網站副本,目錄結構如下

+ /var/www/website
  |- es
  |- en

es目錄服務於網站的西班牙語版本,而en服務於英文版本(默認語言)。

URL 模式就像

# English version
https://example.com/
https://example.com/en/ -> Redirects to https://example.com/

# Spanish version
https://example.com/es/

static 文件僅從各自的目錄提供。

現在,我有以下Apache2配置

<VirtualHost *:443>
        # The primary domain for this host
        ServerName example.com

        DocumentRoot /var/www/website
        <Directory /var/www/website>
                Require all granted
                AllowOverride all

                RewriteEngine on
                RewriteBase /
                RewriteCond %{HTTP:Accept-Language} ^es [NC]
                RewriteRule ^$ /es/ [R]

                RewriteCond %{HTTP:Accept-Language} ^en [NC]
                RewriteRule ^$ /en/ [R]

                RewriteCond %{HTTP:Accept-Language} !^en [NC]
                RewriteCond %{HTTP:Accept-Language} !^es [NC]
                RewriteRule ^$ /en/ [R]
        </Directory>
</VirtualHost>

我在配置方面遇到了一些問題

  1. https://example.com/es/ and https://example.com/en/ are working but static files are not loading and the URL for the static files looks like https://example.com/image.png which必須是https://example.com/es/image.png (西班牙語)和https://example.com/en/image.png (英語)
  2. https://example.com/en/應該被重定向到https://example.com/並且應該提供英文網站,而相反的情況正在發生。

讓我們首先了解這里發生了什么。

有了這樣的規則

RewriteRule ^$ /es/ [R]

您正在將請求重定向到//es/

重定向的意思是,服務器會告訴瀏覽器go 在其他地方搜索內容。

然后瀏覽器將向/es/發送另一個請求。 這不會被重寫或重定向,因為沒有匹配的規則。

您的 html 文件顯然包含具有絕對 URL 的引用,如下所示:

<img src="/image.png" />

因此,您的瀏覽器將發送一個對/image.png的請求,該請求不會被重定向,也不會被重寫。

有不同的方法可以解決這個問題:

1. 將您的 html/code 更新為具有正確路徑的絕對 URL

像這樣:

<img src="/es/image.png" />

這是最好的解決方案恕我直言。 根據您生成內容的方式,可能會有一個選項來設置項目的基礎 URL。

1b。 讓網絡服務器為您即時執行這些替換

您可以考慮是否希望 apache 為您進行這些替換,例如使用mod_substitute ,但在某些情況下您可能無法使用這種方法。 我不會推薦它。

2. 將您的 html/code 更新為相對 URL

IE

<img src="image.png" />

乍一看這聽起來不錯,但如果您的頁面結構復雜,可能會變得很難看,例如/es/foo/bar/somepage.html需要<img src="../../image.png" />參考/es/image.png

如果您想在/es/foo/es/foo/下提供相同的內容(不重定向其中之一),這可能會變得特別棘手。 兩者需要不同的圖像相對路徑。

3.重寫/image.png的請求

理論上,您可以讓 Apache 將對 /image.png 的請求重寫為/image.png/es/image.png/en/image.png取決於接受語言 header。

我不建議這樣做,因為它會導致奇怪的行為。 例如,假設用戶有意識地決定訪問/en/ ,即使他的語言設置更喜歡西班牙語。 然后,瀏覽器將請求/image.png ,服務器將根據語言設置提供圖像的西班牙語變體。 而 HTML 顯示的是英文內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM