인프런 커뮤니티 질문&답변

개foot님의 프로필 이미지
개foot

작성한 질문수

PHP 7+ 프로그래밍

67 - 인증 (Auth)

routes 설정

해결된 질문

작성

·

667

0

강의중에 /auth/login 을 라우트에 설정했음에도 지금 /auth/login을 찾을 수 없다고 나오는데 어떡하죠?? 

ㅠㅠ 그리고 참고로 hit 함수에서 저 동그란 부분을 '/auth/login 으로 설정해주면

uri가 / 임에도 로그인 페이지가 나타나는데,

이럴땐 어떻게 대쳐하면 되나요.. 하루종일 고민중에 질문합니다... ㅠㅠ

답변 14

1

정상우님의 프로필 이미지
정상우
지식공유자

다행입니다. 아무래도 routes 를 객체지향이 아닌, routes 함수에서 foreach 를 돌면서 hit 함수를 여러번 호출하게 되고 등록된 routes 들을 모두 검증해야 하니 여러 번 찍힐 수가 있습니다. :)

0

개foot님의 프로필 이미지
개foot
질문자

감사합니다!! ㅎㅎ

0

정상우님의 프로필 이미지
정상우
지식공유자

explode 함수를 사용하여 ? 문자로 분리를 하였기 첫 번째 인덱스에는 path 를 반환합니다. 쿼리 스트링은 두 번째 인덱스에 담겨 있을거에요. 때문에 path 만 있더라도 통과가 가능합니다~

0

개foot님의 프로필 이미지
개foot
질문자

hit 함수에서 SERVER['REQUEST_URI']  이렇게 받은 부분은 

참고 처럼 된 처리는  path만 비교해서 쿼리까지도 통과 되나요?

$[requestPath ] = explode('?', $_SERVER['REQUEST_URI'] - 참고-

0

개foot님의 프로필 이미지
개foot
질문자

와.. 완벽해졌습니다!!

쿼리도 필요한곳에 들어가게 되네요. web.php 설정없이도... 어떻게 이렇게 되지ㅠㅠ  진짜 감사합니다. 

그리고  지금 hit 함수에  $_SERVER['REQUEST_METHOD']  var_dump로 약간의 디버깅? 을 했는데 원래

이렇게 많이 나오는게 정상인가요? 제생각엔 주소만 한번 요청하면 한번 나오는게 맞지 않나요? ㅠㅠ 

0

정상우님의 프로필 이미지
정상우
지식공유자

$_SERVER['REQUEST_URI'] 사용시 아래와 같은 느낌으로 처리해보세요. 테스팅 부분은 참고용이고, hit 함수에서 $_SERVER['REQUEST_URI']explode 로 처리 한 것에 주목하시면 됩니다.

function hit($path, $method = null)
{
    [ $requestPath ] = explode('?', $_SERVER['REQUEST_URI']);
    $is = $requestPath == $path;
    if ($method) {
        $is = $is && strtoupper($method) == $_SERVER['REQUEST_METHOD'];
    }
    return $is;
}

/**
 * Testing
 */

// Fake
$_SERVER['REQUEST_URI'] = '/post/delete?id=1';
$_SERVER['REQUEST_METHOD'] = 'GET';

assert(hit('/post/delete', 'get')); // -> passed

0

개foot님의 프로필 이미지
개foot
질문자

자세히는 모르겠는데, 지금 라우팅 설정 후에 SERVER['PATH_INFO']는 주소는 표시 되는데요.

페이지 변화가 없어서, SERVER['REQUEST_URI ']로 쓰고 있는데 페이지 변화가 있습니다.

참고로 대신에 쿼리까지 모든 라우팅 주소(web.php)설정은 따로 해야하는 번거로움이 생겼네요. ㅠㅠ

0

정상우님의 프로필 이미지
정상우
지식공유자

테스트를 해보실 필요가 있습니다. 아래에서 보면 REQUEST_URIGet 파라매터까지 포함하므로 매핑이 제대로 이루어지지 않을 수도 있습니다. 물론 이는 hit 함수에서 explode 함수 등을 사용하여 별도로 처리해줄 수 있겠지만, PATH_INFO 가 원하는 정보를 담고있기에 본 프로젝트에서는 이를 사용했습니다. 만약에 Post 부분을 하다가 문제가 생긴다면, 이 부분도 테스트 해보시길 바랍니다.

0

개foot님의 프로필 이미지
개foot
질문자

서버 해결 했습니다.. 아이디어 주셔서 감사합니다 .

route 함수가 계속 index 화면만 보여주어서,

hit 함수에서 SERVER['PATH_INFO'] ->  SERVER['REQUEST_URI ']  하니깐 되네요!! 감사합니다. ^^

0

정상우님의 프로필 이미지
정상우
지식공유자

보기엔 별 이상 없어보이는데, 웹 서버 쪽의 설정을 건드려보는 것이 좋을 듯합니다.
라라벨의 공식 프로젝트 템플릿인 https://github.com/laravel/laravel
에서 public/.htaccess 에 가면 아래와 같은 코드가 있을텐데 한 번 적용시켜보는 것도 방법입니다.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

0

개foot님의 프로필 이미지
개foot
질문자

아!!! 네!! 지금 아파치2 서버를 쓰고 있습니다. 그리고 mods 시큐리티도 쓰고 있어요!

찾아봤는데 일단 그 dir.conf 파일을 조작 해야하는거 같은데...

그러면 지금 이라우터 함수를 쓰기 위해서는  index.php 설정은 어떻게 해야할까요?? ㅠㅠ 

web.php 입니다.

routes 함수 입니다.

0

정상우님의 프로필 이미지
정상우
지식공유자

혹시 웹 서버는 개발 서버가 아니라 Apache 를 쓰고 계신다거나 다른 서버를 사용하고 계실까요? 만약 개발 서버가 아니라면, ApacheNginx 라면 모든 요청을 index.php 로 보내야하는 설정이 필요할 수도 있습니다. 그 외의 라우트의 경우, routes 함수에서 모든 것을 관장하기 때문에 보통 문제가 발생한다면 그 함수에서 발생하곤 하는데 .. routes 함수가 어떻게 작성되어 있는 지, web.php 에는 어떤 식으로 매핑되어 있는 지도 볼 필요가 있을 것 같아요.

0

개foot님의 프로필 이미지
개foot
질문자

다른것까지 문제가 있습니다 ㅠㅠ 일단 web.php /auth/login 으로도 줬는데 인식이 안되네요.

저 hit함수는 정말 연관이 없다고 생각을 하는데... 저기 조건 삼항식 false 일때,

조건을 /auth/login 바꾸면 'http://localhost:8080/' path로 로그인창이뜨네요.

0

정상우님의 프로필 이미지
정상우
지식공유자

안녕하세요.

?! $_SERVER['PATH_INFO']홈(http://localhost:8080) 에서는, 그러니까 패치가 / 일 경우에는 값이 비어있을 것이라서 비어 있을 경우 '/' 를 주도록 처리되어 있습니다.  저것이 문제라면 다른 라우트는 잘 동작하나요? 아니면 다른 것까지 문제가 발생한 건가요?

개foot님의 프로필 이미지
개foot

작성한 질문수

질문하기