![Nginx 重写和域名中的 - 字符](https://linux22.com/image/582889/Nginx%20%E9%87%8D%E5%86%99%E5%92%8C%E5%9F%9F%E5%90%8D%E4%B8%AD%E7%9A%84%20-%20%E5%AD%97%E7%AC%A6.png)
我有一个包含 - 字符的域名。例如 my-domain.com。当我使用重写时,Nginx 错误地重写了 URL,浏览器被重定向到 my.com 而不是 my-domain.com。我的重写规则有什么问题?
server {
listen 80;
server_name www.my-domain.com;
rewrite ^/(.*) https://www.my-domain.com permanent;
}
答案1
您使用的服务器块看上去并没有什么问题。
我使用运行 nginx 1.0.13 和 nginx 1.2.0 的 CentOS 6.2 虚拟机测试了您提供的确切块。我使用 curl 提供匹配的主机头:
curl --header "Host:www.my-domain.com" --head 127.0.0.1
响应没有显示错误,成功指向新的目的地(注意“位置”标题):
HTTP/1.1 301 Moved Permanently
Server: nginx/1.2.0
Date: Sun, 29 Apr 2012 18:56:45 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: https://www.my-domain.com
值得注意的是,破折号在正则表达式中是一个特殊字符,因此\-
在正则表达式中使用时需要转义(即)。但是,在您的服务器块中,您的 server_name 和重写目标都不是正则表达式(尽管 server_name 可能是正则表达式)。
顺便说一句,如果您不使用捕获,则可以将重写简化为:
rewrite ^ https://www.my-domain.com permanent;
您的重定向很可能已被浏览器缓存(这是“永久”重定向,因此可能被浏览器/中间代理缓存)。处理这种情况的一些建议可能包括:
- 强制刷新:Ctrl+F5
- 清除浏览器缓存并重新启动浏览器
- 使用隐私浏览模式
- 使用开发者工具(例如 Firebug)检查位置标头
- 刷新 DNS 缓存
当测试此类配置时,您可能希望在每次修改时做出明显的改变(例如 www1 或 /test1 等),以便您可以验证您没有加载缓存内容。