如何实现同一本地Nginx页面通过两个URL访问且无跳转?
首先要明确:你想要的是让同一个项目同时支持域名直连(http://project.loc)和IP/localhost加路径(localhost/project.loc、127.0.0.1/project.loc)两种访问方式且无跳转,这个需求Nginx完全能搞定。之前出现跳转大概率是配置或项目代码里的硬编码导致的,咱们一步步调整:
1. 确保本地Hosts映射正常(基础前提)
先确认你的hosts文件(Windows在C:\Windows\System32\drivers\etc\hosts,Linux/macOS在/etc/hosts)里已经有这条映射:
127.0.0.1 project.loc
这个你应该已经配置了,否则http://project.loc根本访问不了,不过还是提一下以防万一。
2. 修改Nginx配置,新增路径路由规则
你需要在现有Nginx配置里新增一个server块(或者调整现有块),专门处理localhost和127.0.0.1的请求,并把/project.loc路径下的请求转发到你的项目根目录。
示例配置
假设你原有的project.loc服务器配置是这样的:
server { listen 80; server_name project.loc; root /var/www/project; # 替换成你的项目实际根目录 index index.html index.php; # 根据你的项目类型调整(比如纯静态就只留index.html) # 这里是你原有的其他配置,比如PHP处理、静态文件缓存等 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
现在新增一个处理localhost/127.0.0.1的server块:
server { listen 80; server_name localhost 127.0.0.1; # 匹配/project.loc路径,转发到项目根目录 location /project.loc { # 去掉路径前缀,把/project.loc/xxx转换成/xxx rewrite ^/project.loc(.*)$ $1 break; root /var/www/project; # 和原server块的root保持一致 index index.html index.php; # 同样匹配原配置 # 复制原server块里的必要配置,比如PHP处理规则、静态文件缓存等 # 比如上面的PHP处理规则,要原样复制到这里,否则PHP文件会无法解析 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }
3. 解决跳转问题的关键检查
之前访问localhost/project.loc会跳转到project.loc,大概率是这两个原因:
- 项目代码里的硬编码跳转:比如前端HTML里的资源引用用了绝对路径
http://project.loc/css/style.css,或者后端代码里的重定向逻辑固定指向project.loc。你需要把这些改成相对路径(比如./css/style.css),或者动态根据当前请求的域名生成路径。 - Nginx的默认目录跳转:如果你的项目某个目录没有
index文件,Nginx可能会自动跳转到带斜杠的路径,这时候如果原配置里有server_name优先级问题,就会跳转到project.loc。上面的配置里用rewrite规则已经处理了路径前缀,基本能避免这个问题。
4. 验证配置并重启Nginx
修改完配置后,先执行检查命令确保配置没有语法错误:
nginx -t
如果提示test is successful,就重启Nginx让配置生效:
nginx -s reload
之后就可以测试三个地址:http://project.loc、http://localhost/project.loc、http://127.0.0.1/project.loc,应该都能正常访问且不会跳转。
内容的提问来源于stack exchange,提问作者Ladislav Tomsa

