![根据HTTP_HOST重写URL](https://linux22.com/image/598521/%E6%A0%B9%E6%8D%AEHTTP_HOST%E9%87%8D%E5%86%99URL.png)
基本上,我希望用户可以通过内联网和互联网访问该页面。
如果用户通过内网访问,可以在浏览器地址栏中输入服务器的内网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]
对于任何主机来说这都可以实现上述目的。