用于将 ip 重定向到主机名的 Apache httpd.conf
Posted
技术标签:
【中文标题】用于将 ip 重定向到主机名的 Apache httpd.conf【英文标题】:Apache httpd.conf for redirecting ip to hostname 【发布时间】:2012-07-23 21:32:02 【问题描述】:我为我的机器配置了外部 IP 和主机名。
在应用程序内部,我只使用域名来访问 API。因此,当我尝试通过 IP 地址访问我的 API 时,它会显示 302 Moved 临时错误。 因此,对于使用 IP 地址访问服务器的请求(对于主页),它应该重定向到主机名。
也就是说,当用户点击https://XX.XX.XX.XX/main时,它应该被重定向到https://ayz-abc.mysite.com/main
为此,我尝试在 apache 的 httpd.conf 中使用重定向。
<VirtualHost XX.XX.XX.XX>
DocumentRoot "/var/www/html"
#ServerName ayz-abc.mysite.com/
# Other directives here
RewriteEngine On
RewriteRule /.* https://ayz-abc.mysite.com/ [R]
</VirtualHost>
我也尝试过以下方法
<VirtualHost *.portnum>
DocumentRoot "/var/www/html"
RewriteEngine On
RewriteCond %HTTPS on
RewriteRule https://XX.XX.XX.XX/main https://ayz-abc.mysite.com/main [R=301,L]
</VirtualHost>
请帮助我。
【问题讨论】:
302 不是错误。如果服务器以 302 响应,则重定向正在工作。服务器的 HTTP 响应是什么? UI 仍未重定向到主机名,但 API 在内部配置为指向主机名。所以当我尝试从 UI 访问 API 时,对 API 的请求(带有主机名)显示 302 【参考方案1】:好的。您缺少重写条件
<VirtualHost XX.XX.XX.XX>
DocumentRoot "/var/www/html"
#ServerName ayz-abc.mysite.com/
# Other directives here
RewriteEngine On
RewriteCond %HTTP_HOST !^ayz-abc.mysite.com$
RewriteRule /.* https://ayz-abc.mysite.com/ [R]
</VirtualHost>
如果您不包含此条件,即使使用主机名也会重定向
【讨论】:
除 HTTP_HOST 之外的 URL 的其余部分。最好使用 RewriteRule ^(.*)$ ayz-abc.mysite.com$1 [R=301,L]【参考方案2】:试试这个:
RewriteRule $ https://ayz-abc.mysite.com/ [L,R]
你也可以看到重写日志,see here
【讨论】:
我已经尝试使用它,但仍然遇到同样的错误。还有Ankit,在浏览器中,它仍然只显示IP地址..它不会是主机名吗? 重定向永久xx.xx.xx.xx/mainayz-abc.mysite.com/main可以吗?【参考方案3】:这对我有用。在apache的httpd.conf中添加配置
CASE-1:当用户点击http://XX.XX.XX.XX/main 或http://ayz-abc.mysite.com/main 时,它应该被重定向到https://ayz-abc.mysite.com/main
配置:
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
<VirtualHost *:80>
ServerName XX.XX.XX.XX
Redirect /main https://ayz-abc.mysite.com/main
</VirtualHost>
CASE 2:当用户点击https://XX.XX.XX.XX/main时,它应该被重定向到https://ayz-abc.mysite.com/main
配置:
NameVirtualHost *:443
<VirtualHost *:443>
DocumentRoot "/var/www/html"
#Server Name
ServerName XX.XX.XX.XX
SSLEngine on
SSLOptions +StrictRequire
# Redirect to the specified URL
Redirect /main https://ayz-abc.mysite.com/main
<Directory />
SSLRequireSSL
</Directory>
....
....
</VirtualHost>
【讨论】:
【参考方案4】:如果您不使用 API,而只是希望浏览器和爬虫访问 URL 而不是 IP 地址,那么您可以使用 RedirectPermanent。
<VirtualHost XX.XX.XX.XX>
RedirectPermanent / http://ayz-abc.mysite.com/
</VirtualHost>
<VirtualHost XX.XX.XX.XX>
DocumentRoot "/var/www/html"
ServerName ayz-abc.mysite.com/
</VirtualHost>
它的优点是响应 301 HTTP 状态,表示“请使用您将来重定向到的 url”,这有助于搜索引擎。如果您将网站移至新域,则应使用相同的解决方案。
【讨论】:
【参考方案5】:这会将所有对 IP 的请求重定向到您域中的类似地址
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %HTTP_HOST ^12\.34\.56\.78$
RewriteRule ^/(.*)$ https://ayz-abc.mysite.com/$1 [L,R=301]
</IfModule>
【讨论】:
【参考方案6】:如果您使用的是 https 域,请添加以下内容:
# BEGIN HTTPS Redirection Plugin
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %SERVER_PORT !^443$
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]
RewriteCond %HTTP_HOST ^XX\.XX\.XX\.XX$
RewriteRule ^(.*)$ https://your-domain-name.com/$1 [L,R=301]
</IfModule>
# END HTTPS Redirection Plugin
我们在网站上使用 https 重定向插件。上面的代码块是由插件生成的,我们只在代码块中添加了两行。下面两行负责将 IP 设置为域重定向:
RewriteCond %HTTP_HOST ^XX\.XX\.XX\.XX$
RewriteRule ^(.*)$ https://your-domain-name.com/$1 [L,R=301]
这里 ^XX.XX.XX.XX$ 是您的 IP 地址,请将其替换为:^12.34.56.78$ 为您的服务器 IP。
谢谢
【讨论】:
以上是关于用于将 ip 重定向到主机名的 Apache httpd.conf的主要内容,如果未能解决你的问题,请参考以下文章
Apache 2.4 将本地虚拟主机重定向到 https 而不是 http