如何配置Apache2实现www到非www的URL重定向及配置有效性验证
Apache2 配置www到非www重定向的问题解答
问题1:如何配置Apache2,将带www前缀的URL重定向到不带www的同一URL?
实现这个需求有两种常用且可靠的方式,推荐优先在Apache的虚拟主机配置(而非.htaccess)里操作,性能会更好:
方法一:使用RedirectMatch(简单直接)
首先确保你的虚拟主机配置覆盖了带www和不带www的域名,然后添加RedirectMatch规则:
<VirtualHost *:80> ServerName example.org ServerAlias www.example.org # 把HTTP的www请求重定向到非www的HTTPS(如果使用HTTPS的话) RedirectMatch 301 ^/(.*)$ https://example.org/$1 </VirtualHost> <VirtualHost *:443> ServerName example.org ServerAlias www.example.org # 配置SSL证书相关内容(证书要同时覆盖example.org和www.example.org) SSLCertificateFile /path/to/cert.pem SSLCertificateKeyFile /path/to/key.pem # 把HTTPS的www请求重定向到非www RedirectMatch 301 ^/(.*)$ https://example.org/$1 </VirtualHost>
^/(.*)$是正则表达式,匹配请求的路径部分,$1会把匹配到的路径原样带到目标URL里,保证跳转后路径不变。
方法二:使用mod_rewrite(更灵活,适合复杂场景)
先确保启用了mod_rewrite模块(执行a2enmod rewrite然后重启Apache),然后在虚拟主机配置里添加规则:
<VirtualHost *:443> ServerName example.org ServerAlias www.example.org # SSL配置省略... RewriteEngine On # 如果主机名是www.example.org,就重定向到非www RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC] RewriteRule ^(.*)$ https://example.org/$1 [R=301,L] </VirtualHost>
[NC]表示不区分大小写,[R=301]是永久重定向(对SEO友好),[L]表示这是最后一条规则,匹配后不再执行后续规则。
问题2:你提供的配置是否有效?
先把你给的配置贴出来:
return (<VirtualHost _default_:443> ServerName example.org ServerAlias www.example.irg RedirectMatch 301 https://www.example.org https://example.org </VirtualHost> )
很遗憾,这份配置是无效的,有几个关键问题:
- 域名拼写错误:
ServerAlias里写的是www.example.irg,应该是www.example.org,否则Apache不会识别这个带www的域名请求。 RedirectMatch语法错误:RedirectMatch的第一个参数必须是正则表达式,而不是完整的URL。你现在写的https://www.example.org会被当成路径匹配,根本不会触发重定向。正确的写法应该匹配所有来自www.example.org的请求路径,然后重定向到对应的非www路径。
修正后的配置示例:
<VirtualHost *:443> ServerName example.org ServerAlias www.example.org # 别忘了添加SSL证书的配置,否则HTTPS请求会报错 SSLCertificateFile /path/to/your/certificate.pem SSLCertificateKeyFile /path/to/your/private-key.pem RedirectMatch 301 ^/(.*)$ https://example.org/$1 </VirtualHost>
或者用更清晰的mod_rewrite写法,效果是一样的,看你个人偏好。
内容的提问来源于stack exchange,提问作者user9027927
相关产品推荐
相关产品推荐

