如何在nginx中创build一个与AND一起使用的位置,而没有结尾的斜杠?

现在我有这个configuration:

location ~ ^/phpmyadmin/(.*)$ { alias /home/phpmyadmin/$1; } 

但是,如果我访问www.mysite.com/phpmyadmin (注意缺less斜线),它不会find我正在寻找的404。我认为,因为我没有包括斜线。 我该如何解决这个问题?

它可能在你正在使用的正则expression式中 –

 location ~ ^/phpmyadmin/(.*)$ 

以上将匹配/ phpmyadmin /,/ phpmyadmin / anything / else /这里,但是它不会匹配/ phpmyadmin,因为正则expression式包含尾部的斜杠。

你可能想要这样的东西:

 location ~ /phpmyadmin/?(.*)$ { alias /home/phpmyadmin/$1; } 

问号是一个正则expression式量词,应该告诉nginx匹配前一个字符(斜线)的零或一个。

HTH

更好的解决scheme:

 location ~ ^/phpmyadmin(?:/(.*))?$ { alias /home/phpmyadmin/$1; } 

确保服务器首先具有/home/phpmyadmin权限。

你为什么不使用

 location /phpmyadmin { alias /home/phpmyadmin; } 

这个redirect只会重写带有和不带尾随斜杠的URL。 斜线后面的任何内容都不会被覆盖。

domain.com/location =>redirect到domain.com/new/location
domain.com/location =>redirect到domain.com/new/location
domain.com/location/other =>不redirect

 server { # 301 URL Redirect rewrite ^/location/?$ /new/location permanent; } 

你有没有尝试过使用try_files指令?

 try_files $uri $uri/ =404; 

我知道这是一个古老的问题,但是对于任何通过Google来到这里的人,我都是这样解决的(@ kbec的变化很好)。

 location ~ ^/foo(/.*)?$ { proxy_pass http://$backend$1$is_args$args } 

这将捕获/foo任何变化,并将其redirect到另一个url上的/bar (包括参数)。 我用一个proxy_pass指令显示它,但它也可以使用alias

  • /foo – > /bar
  • /foo/ – > /bar/
  • /foo/sub – > /bar/sub
  • /foo/sub1/sub2/?param=value – > /bar/sub1/sub2/?param=value

它的工作原理是$1可以捕获子资源加上前导斜杠,所以它不会捕获/fooextra/类的东西。 它也会正确地redirect当前或不存在的结尾斜杠。

我是这样做的

 rewrite ^/promo/?$ http://example.com/promo/page43902.html; location /promo/ { root /var/www; }