복붙노트

PHP로 URL 재 작성

PHP

PHP로 URL 재 작성

다음과 같은 URL이 있습니다.

url.com/picture.php?id=51

해당 URL을 다음으로 변환하는 방법은 무엇입니까?

picture.php/Some-text-goes-here/51

나는 WordPress가 똑같이한다고 생각한다.

PHP에서 친숙한 URL을 만들려면 어떻게해야합니까?

해결법

  1. ==============================

    1.

    기본적으로 다음 두 가지 방법으로 수행 할 수 있습니다.

    루트 폴더에 .htaccess라는 파일을 추가하고 다음과 같이 추가하십시오.

    RewriteEngine on
    RewriteRule ^/?Some-text-goes-here/([0-9]+)$ /picture.php?id=$1
    

    이렇게하면이 폴더에 대해 mod_rewrite를 활성화하도록 Apache에 지시하고 일반 표현식과 일치하는 URL을 묻는 메시지가 표시되면 최종 사용자는이를 보지 않고 원하는 내용으로 내부적으로 다시 작성합니다. 쉽지만 유연하지 않으므로 더 많은 힘이 필요하다면 :

    대신 .htaccess 파일에 다음을 입력하십시오 : (슬래시에주의하십시오)

    FallbackResource /index.php
    

    이렇게하면 사이트에서 일반적으로 찾을 수없는 모든 파일에 대해 index.php가 실행됩니다. 예를 들어 다음과 같이 할 수 있습니다.

    $path = ltrim($_SERVER['REQUEST_URI'], '/');    // Trim leading slash(es)
    $elements = explode('/', $path);                // Split path on slashes
    if(empty($elements[0])) {                       // No path elements means home
        ShowHomepage();
    } else switch(array_shift($elements))             // Pop off first item and switch
    {
        case 'Some-text-goes-here':
            ShowPicture($elements); // passes rest of parameters to internal function
            break;
        case 'more':
            ...
        default:
            header('HTTP/1.1 404 Not Found');
            Show404Error();
    }
    

    이것은 큰 사이트와 CMS 시스템이 URL, 설정 및 데이터베이스 종속 URL 등을 분석 할 때 훨씬 더 많은 유연성을 허용하기 때문에이를 수행하는 방법입니다. 산발적 인 사용을 위해 .htaccess의 하드 코드 된 다시 쓰기 규칙은 훌륭하게 수행됩니다.

  2. ==============================

    2.

    picture.php의 경로 만 바꾸고 싶다면 .htaccess에 재 작성 규칙을 추가하면됩니다.하지만 Wordpress처럼 URL을 다시 쓰려면 PHP가 필요합니다. 다음은 간단한 예제입니다.

    폴더 구조

    루트 폴더 인 .htaccess와 index.php에는 두 개의 파일이 필요하며 나머지 .php 파일은 inc /와 같은 별도의 폴더에 저장하는 것이 좋습니다.

    root/
      inc/
      .htaccess
      index.php
    

    .htaccess

    RewriteEngine On
    RewriteRule ^inc/.*$ index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
    

    이 파일에는 네 가지 지시문이 있습니다.

    index.php

    이제 모든 것이 index.php로 리디렉션되므로 url이 올바른지, 모든 매개 변수가 있는지, 매개 변수의 유형이 올바른지가 결정됩니다.

    URL을 테스트하려면 일련의 규칙이 필요하며 그 중 가장 적합한 도구는 정규 표현식입니다. 정규 표현식을 사용함으로써 우리는 한번에 두 개의 파리를 죽일 것입니다. 이 테스트를 통과하려면 URL에 허용 된 문자로 테스트 된 모든 필수 매개 변수가 있어야합니다. 다음은 규칙의 몇 가지 예입니다.

    $rules = array( 
        'picture'   => "/picture/(?'text'[^/]+)/(?'id'\d+)",    // '/picture/some-text/51'
        'album'     => "/album/(?'album'[\w\-]+)",              // '/album/album-slug'
        'category'  => "/category/(?'category'[\w\-]+)",        // '/category/category-slug'
        'page'      => "/page/(?'page'about|contact)",          // '/page/about', '/page/contact'
        'post'      => "/(?'post'[\w\-]+)",                     // '/post-slug'
        'home'      => "/"                                      // '/'
    );
    

    다음은 요청 URI를 준비하는 것입니다.

    $uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
    $uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
    $uri = urldecode( $uri );
    

    이제 uri 요청을 얻었으므로 마지막 단계는 정규 표현식 규칙에 대해 uri를 테스트하는 것입니다.

    foreach ( $rules as $action => $rule ) {
        if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
            /* now you know the action and parameters so you can 
             * include appropriate template file ( or proceed in some other way )
             */
        }
    }
    

    우리가 정규 표현식에서 명명 된 서브 패턴을 사용하기 때문에 $ _GET 배열을 PHP가 PHP와 거의 동일하게 채 웁니다. 그러나 동적 URL을 사용할 때 $ _GET 배열은 매개 변수를 확인하지 않고 채워집니다.

        /picture/some+text/51
    
        Array
        (
            [0] => /picture/some text/51
            [text] => some text
            [1] => some text
            [id] => 51
            [2] => 51
        )
    
        picture.php?text=some+text&id;=51
    
        Array
        (
            [text] => some text
            [id] => 51
        )
    

    이 몇 줄의 코드와 기본 표현에 대한 기본 지식만으로도 견고한 라우팅 시스템을 구축하기에 충분합니다.

    완전한 소스

    define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );
    
    $rules = array( 
        'picture'   => "/picture/(?'text'[^/]+)/(?'id'\d+)",    // '/picture/some-text/51'
        'album'     => "/album/(?'album'[\w\-]+)",              // '/album/album-slug'
        'category'  => "/category/(?'category'[\w\-]+)",        // '/category/category-slug'
        'page'      => "/page/(?'page'about|contact)",          // '/page/about', '/page/contact'
        'post'      => "/(?'post'[\w\-]+)",                     // '/post-slug'
        'home'      => "/"                                      // '/'
    );
    
    $uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
    $uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
    $uri = urldecode( $uri );
    
    foreach ( $rules as $action => $rule ) {
        if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
            /* now you know the action and parameters so you can 
             * include appropriate template file ( or proceed in some other way )
             */
            include( INCLUDE_DIR . $action . '.php' );
    
            // exit to avoid the 404 message 
            exit();
        }
    }
    
    // nothing is found so handle the 404 error
    include( INCLUDE_DIR . '404.php' );
    
  3. ==============================

    3.

    거의 모든 것을 index.php로 전달하는 .htaccess 파일입니다.

    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_URI} !-l
    RewriteCond %{REQUEST_FILENAME} !\.(ico|css|png|jpg|gif|js)$ [NC]
    # otherwise forward it to index.php
    RewriteRule . index.php
    

    그런 다음 $ _SERVER [ "REQUEST_URI"]를 파싱하고 picture.php 또는 기타 경로로 파싱합니다.

  4. ==============================

    4.

    PHP가 당신이 찾고있는 것이 아니며, mod_rewrite를 확인하십시오.

  5. ==============================

    5.

    이미 답변되었지만 작성자의 의도는 전면 컨트롤러 유형 앱을 만드는 것이지만 문제에 대한 문자 적 ​​규칙을 게시하고 있습니다. 같은 문제가있는 사람.

    RewriteEngine On
    RewriteRule ^([^/]+)/([^/]+)/([\d]+)$ $1?id=$3 [L]
    

    위 그림은 url picture.php / Some-text-goes-here / 51에서 작동합니다. index.php를 리디렉션 앱으로 사용하지 않아도됩니다.

  6. from https://stackoverflow.com/questions/16388959/url-rewriting-with-php by cc-by-sa and MIT lisence