根据HTTP_HOST重写URL

根据HTTP_HOST重写URL

基本上,我希望用户可以通过内联网和互联网访问该页面。

如果用户通过内网访问,可以在浏览器地址栏中输入服务器的内网IP,192.168.x.x

但是当用户通过互联网访问该页面时,他们可以输入服务器的公网 IP,我会将 URL 重写为服务器的公网 IP。

我已经尝试过了,但我得到的页面没有正确重定向

RewriteEngine   On
RewriteBase     /mypath/
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteCond     %{HTTP_HOST}        !192.168.0.1
RewriteRule     ^(.*)$          http://<public.ip.of.server>/mypath/$1/ [L,R=301]
RewriteCond     %{HTTP_HOST}        !<public.ip.of.server>
RewriteRule     ^(.*)$          http://192.168.0.1/mypath/$1/   [L,R=301]

我也尝试过这个,但我得到的页面500内部服务器错误

<If "%{HTTP_HOST} == '192.168.0.1'">
RewriteEngine   On
RewriteBase     /mypath/
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$          http://192.168.0.1/mypath/$1/   [L,R=301]
</If>
<If "%{HTTP_HOST} == 'public.ip.of.server'">
RewriteEngine   On
RewriteBase     /mypath/
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$          http://<public.ip.of.server>/mypath/$1/ [L,R=301]
</If>

难道我做错了什么?

答案1

我正在使用 Apache 2.2.3

<If>指令是 Apache 2.4 核心的一部分。如果您将这些指令放入 2.2 中,它们将导致 500 服务器错误。您完全不清楚自己想要做什么,但您可以<If>用简单的 替换这些块RewriteCond

这里的重要概念RewriteCond只适用于紧接着的 RewriteRule指令,它们不会应用于任何其他指令,只会应用于单个指令。因此,如果您需要将条件应用于多个规则,则需要复制条件。

RewriteEngine   On
RewriteBase     /mypath/

RewriteCond     %{HTTP_HOST} ^192.168.0.1$
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$          http://192.168.0.1/mypath/$1/   [L,R=301]

RewriteCond     %{HTTP_HOST} ^public.ip.of.server$
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$          http://<public.ip.of.server>/mypath/$1/ [L,R=301]

但是您可以摆脱所有这些,因为您无需使用http://hostname位即可进行重定向:

RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$  /mypath/$1/   [L,R=301]

对于任何主机来说这都可以实现上述目的。

相关内容