후행 슬래시없이 AND와 함께 작동하는 위치를 nginx에 어떻게 만들 수 있습니까?


46

지금이 구성이 있습니다.

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

그러나 방문하면 www.mysite.com/phpmyadmin(후행 슬래시가 없음) 404를 찾고있는 것을 찾지 못합니다. 후행 슬래시를 포함하지 않기 때문에 가정합니다. 이 문제를 어떻게 해결할 수 있습니까?


2
나는이 질문이 아주 오래되었다는 것을 알고 있지만 받아 들여진 대답을 바꿀 필요성에 대해 강조하고 싶습니다. 경험이없는 사용자 (이런 종류의 QA를 검색 할 사용자)는 현재 승인 된 답변을 사용하여 보안 허점을 만들 수 있습니다.
Bozzy

답변:


34

사용중인 정규 표현식에있을 수 있습니다.

location ~ ^/phpmyadmin/(.*)$

위의 내용은 / phpmyadmin /, / phpmyadmin / anything / else / here와 일치하지만 정규식에 슬래시가 포함되어 있기 때문에 / phpmyadmin과 일치하지 않습니다.

아마도 다음과 같은 것을 원할 것입니다 :

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

물음표는 정규식 수량 자이며 nginx에 이전 문자 중 하나 또는 슬래시와 일치하도록 지시해야합니다.

경고 : 커뮤니티는이 솔루션을 가능한 보안 위험으로 간주했습니다.


감사합니다! 설명도 감사합니다. 앞으로 편리하게 올 것입니다.
Rob

15
패턴이 정확하지 않습니다. 또한 "/ phpmyadmin1234"와 같은 경로와 일치 할 수도 있습니다. 분명히 원하는 것은 아닙니다. @kbec의 솔루션이 옳습니다.
Meow

3
이것을 명시 적으로 내리는 것에 대해 유감스럽게 생각하지만 @Meow 의견은 무시 하는 것이 중요 합니다. 이로 인해 웹 서버가 잘못 구성되어 보안 허점이있을 수 있습니다.
다니엘 F

34

더 나은 솔루션 :

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

서버에 /home/phpmyadmin먼저 권한이 있는지 확인하십시오 .


허용되는 답변과의 차이점 설명 :

그것은 정규 표현식 에 관한 것 입니다.

우선, ^char은 문자열의 시작 부분부터 일치하고 중간 어딘가가 아니라는 것을 의미합니다. $문자열의 끝과 일치하는 최종 수단에서.

(?:)수단은 비 캡처 그룹을 - 우리는 캡처 결과에 그것을 원하지 않지만, 우리는 간단한 그룹 일부 문자로합니다. 우리는 /char을 부모 경로의 중요한 부분이 아닌 자식 경로의 중요하지 않은 부분으로 만들고 싶기 때문에 이렇게 그룹화합니다 .


왜 더 낫습니까?
Meekohi

2
@Meow 님이 수락 한 답변에 대해 답변했습니다
kbec

2
이것은 정답
Yonn Trimoreau

@Meekohi 나는 설명을 썼다
kbec

8

왜 그냥 사용하지 않습니까

location /phpmyadmin {
    alias /home/phpmyadmin;
}

?


그것이 저에게 효과가 없었기 때문입니다. 여기를 참조하십시오 : serverfault.com/questions/375602/…
Rob

1
@Rob alias지시문에 슬래시없이 시도 했습니까 ?
Shane Madden

이것은 실제로 정답이며 올바른 방법입니다. 후행 슬래시를 제외하면 후행 슬래시 유무에 관계없이 입력 된 URL에서 작동합니다. Nginx에서 아무것도 복잡하게 할 필요가 없으므로 간단하고 복잡한 정규 표현식을 유지하면 다른 재미있는 것들로 Nginx 속도가 느려집니다.
MitchellK

4
이것의 문제점은 그것이 /phpmyadminblahblahblahblah또는 다른 조합 에서도 일치한다는 것입니다
Gary Green

6

나는 이것이 오래된 질문이라는 것을 알고 있지만 Google을 통해 여기서 끝나는 사람은 다음과 같은 방법으로 해결했습니다 (@kbec의 변형, 꽤 좋았습니다).

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

이렇게하면 변형을 캡처 하여 다른 URL (매개 변수 포함)로 /foo리디렉션합니다 /bar. proxy_pass지시어로 표시하고 있지만 작동합니다 alias.

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

$1선택적으로 하위 리소스와 선행 슬래시를 캡처하므로과 같은 것을 캡처하지 않기 때문에 작동합니다 /fooextra/. 또한 현재 또는 존재하지 않는 종료 슬래시를 올바르게 리디렉션합니다.


1
proxy_pass를 사용하고 인수에 신경을 쓰는 경우를 고려해 주셔서 감사합니다. 당신은 내 공감대를 가지고 있습니다.
다니엘 F

2

이 리디렉션은 뒤에 슬래시가 있거나없는 URL 다시 작성합니다. 슬래시 뒤에 오는 것은 덮어 쓰지 않습니다.

domain.com/location => domain.com/new/location으로 리디렉션 domain.com/location => domain.com/new/location으로 리디렉션 domain
> com / location / other => 리디렉션
되지 않음

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


0

나는 그렇게 했어

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

0

간단히 두 번 다시 쓰지 마십시오.

location ~ ^/phpmyadmin
{
    rewrite /phpmyadmin /home/phpmyadmin/ break;
    rewrite /phpmyadmin/(.*) /home/phpmyadmin/$1 break;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.