Redirect 为什么重写指令会导致“错误”;301永久迁居“;用Nginx?

Redirect 为什么重写指令会导致“错误”;301永久迁居“;用Nginx?,redirect,nginx,webserver,rewrite,security,Redirect,Nginx,Webserver,Rewrite,Security,下面是我在Nginx 1.2.5运行的服务器的配置文件中的一个简化版本,但它会导致301永久移动到位置:http://example.com/phpmyadmin/在提供数据之前,这不是我从rewrite指令的默认行为中所期望的 server { listen 80; location /pma { rewrite ^ /phpmyadmin; } location /phpmyadmin { root /var/www;

下面是我在Nginx 1.2.5运行的服务器的配置文件中的一个简化版本,但它会导致
301永久移动到
位置:http://example.com/phpmyadmin/
在提供数据之前,这不是我从
rewrite
指令的默认行为中所期望的

server {
    listen 80;
    location /pma {
        rewrite ^ /phpmyadmin;
    }
    location /phpmyadmin {
        root /var/www;
        index Documentation.html;
    }
}
当我转到
http://example.com/pma
在浏览器中,提供数据,但地址栏中的URL变为
http://example.com/phpmyadmin/
当它应该停留时
http://example.com/pma

如何避免Nginx发送永久移动的
301
,这样它就不会暴露我服务器上的实际目录结构?

试试别名:

server {
    listen 80;
    location /pma {
        alias /phpmyadmin;
    }
    location /phpmyadmin {
        root /var/www;
        index Documentation.html;
}

我认为您需要使用别名而不是重写。“重写”会创建一个“新”URL,因此会进行重定向

server {
    listen 80;
    location /pma {
        alias  /var/www/phpmyadmin;
        index Documentation.html;
    }
    location /phpmyadmin {
        root /var/www;
        index Documentation.html;
    }
}

但是我想要一个重定向,只需要一个内部重定向,它不需要301和服务数据的实际位置信息一起发送。同样,这个例子是高度简化和重写的,配置在其原始形式中具有完美的意义。问题更多的是为什么
rewrite
会导致
301
。至少在重写模块的官方页面上没有记录。同样的事情。Nginx发送一个
301
,URL更改为
http://example.com/phpmyadmin/
在浏览器中,而它本应保持
http://example.com/pma
。您是否删除了重写以支持别名?当我需要它以特定方式更改URI时,为什么要删除重写?在这种情况下,alias可以替代根据你想要的结果重写。