现在我有这个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; }