![](/img/trans.png)
[英]Apache mod_rewrite RewriteCond to by-pass static resources not working
[英]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>
我在配置方面遇到了一些问题
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
(英语)https://example.com/en/
应该被重定向到https://example.com/
并且应该提供英文网站,而相反的情况正在发生。让我们首先了解这里发生了什么。
有了这样的规则
RewriteRule ^$ /es/ [R]
您正在将请求重定向到/
到/es/
。
重定向的意思是,服务器会告诉浏览器go 在其他地方搜索内容。
然后浏览器将向/es/
发送另一个请求。 这不会被重写或重定向,因为没有匹配的规则。
您的 html 文件显然包含具有绝对 URL 的引用,如下所示:
<img src="/image.png" />
因此,您的浏览器将发送一个对/image.png
的请求,该请求不会被重定向,也不会被重写。
有不同的方法可以解决这个问题:
像这样:
<img src="/es/image.png" />
这是最好的解决方案恕我直言。 根据您生成内容的方式,可能会有一个选项来设置项目的基础 URL。
您可以考虑是否希望 apache 为您进行这些替换,例如使用mod_substitute
,但在某些情况下您可能无法使用这种方法。 我不会推荐它。
IE
<img src="image.png" />
乍一看这听起来不错,但如果您的页面结构复杂,可能会变得很难看,例如/es/foo/bar/somepage.html
需要<img src="../../image.png" />
参考/es/image.png
。
如果您想在/es/foo
和/es/foo/
下提供相同的内容(不重定向其中之一),这可能会变得特别棘手。 两者需要不同的图像相对路径。
/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.