我正在使用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;
,但都没有成功。
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;
}
}
答案 0 :(得分:16)
我在serverfault上发布了此问题的可能解决方案;为方便起见,转载于此处:
如果我正确理解了这个问题,那么当您的请求是http://example.com/foo/index.html且没有斜杠时,您希望自动投放,而不使用301重定向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;
它也应该有用。
答案 1 :(得分:10)
尝试:
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;
}
}
}
答案 2 :(得分:9)
一个稍微简单的解决方案,对我有用,是禁用absolute_redirect off;
的绝对重定向,如下例所示:
server {
listen 80;
server_name localhost;
absolute_redirect off;
location /foo/ {
proxy_pass http://bar/;
}
如果我在http://localhost:8080/foo
上运行curl,我可以看到重定向HTTP响应中的Location
标头是/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/
由此,我假设任何网络浏览器都会使用相对位置做正确的事情。在Chrome上测试过,它运行正常。
答案 3 :(得分:5)
尝试更改
server_name localhost;
# server_name_in_redirect off;
到
server_name localhost:8080;
server_name_in_redirect on;