我使用NAT在虚拟机中运行nginx的,我有重定向问题,当我从主机访问它。
按预期工作
-
http://localhost:8080/test/index.htm
作品:。 -
http://localhost:8080/test/
:作品。
不能按预期工作
-
http://localhost:8080/test
:重定向到http://localhost/test/
。 这不是我想要的。
我已经试过
根据我GOOGLE了,我试过server_name_in_redirect off;
和rewrite ^([^.]*[^/])$ $1/ permanent;
,都没有成功。
我default.conf:
server {
listen 80;
server_name localhost;
# server_name_in_redirect off;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
location ~ \.php$ {
# rewrite ^([^.]*[^/])$ $1/ permanent;
root /usr/share/nginx/html;
try_files $uri =404;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/tmp/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
我贴一个可能的解决方案在这个问题上serverfault ; 这里转载出于方便:
如果我理解正确的问题,你想自动服务,而无需使用301重定向, http://example.com/foo/index.html当请求是http://example.com/foo没有尾随斜线?
这对我的作品,基本解决方案
如果是这样,我发现这个try_files配置工作:
try_files $uri $uri/index.html $uri/ =404;
- 第一
$uri
完全匹配的URI - 第二
$uri/index.html
匹配包含在路径的最后一个元素的目录名称相匹配的index.html的目录,没有尾随斜线 - 第三
$uri/
匹配的目录 - 第四
=404
如果返回404错误页面没有前述图案匹配的。
我的更新版本
如果在添加server
块:
index index.html index.htm;
并修改try_files
看起来像这样:
try_files $uri $uri/ =404;
它应该工作了。
尝试:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
}
}
一个稍微简单的解决方案,为我工作,就是禁用绝对重定向absolute_redirect off;
如下面的例子:
server {
listen 80;
server_name localhost;
absolute_redirect off;
location /foo/ {
proxy_pass http://bar/;
}
如果我跑卷曲上http://localhost:8080/foo
,我可以看到Location
在重定向HTTP响应头给出/foo/
,而不是http://localhost/foo/
。
$ curl -I http://localhost:8080/foo
HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.8
Date: Tue, 03 Apr 2018 20:13:28 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: /foo/
从这一点,我认为任何Web浏览器会做正确的事与相对位置。 测试在Chrome和它工作正常。
试着改变
server_name localhost;
# server_name_in_redirect off;
至
server_name localhost:8080;
server_name_in_redirect on;