development

PHP로 URL 재 작성

big-blog 2020. 6. 28. 17:39
반응형

PHP로 URL 재 작성


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

url.com/picture.php?id=51

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

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

워드 프레스도 마찬가지라고 생각합니다.

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


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

mod_rewrite를 사용한 .htaccess 경로

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

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

이것은 아파치에게이 폴더에 대해 mod_rewrite를 활성화하도록 지시하고, 정규식과 일치하는 URL을 요청 받으면 최종 사용자가 보지 않고 원하는 것으로 내부적 으로 다시 씁니다 . 쉽고 유연하지 않으므로 더 많은 전력이 필요한 경우 :

PHP 경로

대신 .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();
}

URL, 구성 및 데이터베이스 종속 URL 등을 구문 분석하는 데 훨씬 더 많은 유연성을 허용하기 때문에 이것이 큰 사이트와 CMS 시스템에서 수행하는 방식입니다. 산발적 인 사용의 경우 하드 코딩 된 다시 쓰기 규칙 .htaccess이 적합합니다.


경로를 변경하려는 경우 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]

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

  1. RewriteEngine -재 작성 엔진 사용
  2. RewriteRule- inc/폴더의 모든 파일에 대한 액세스를 거부 하고 해당 폴더에 대한 호출을index.php
  3. RewriteCond - allow direct access to all other files ( like images, css or scripts )
  4. RewriteRule - redirect anything else to index.php

index.php

Because everything is now redirected to index.php, there will be determined if the url is correct, all parameters are present, and if the type of parameters are correct.

To test the url we need to have a set of rules, and the best tool for that is a regular expression. By using regular expressions we will kill two flies with one blow. Url, to pass this test must have all the required parameters that are tested on allowed characters. Here are some examples of rules.

$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'      => "/"                                      // '/'
);

Next is to prepare the request uri.

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

Now that we have the request uri, the final step is to test uri on regular expression rules.

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 )
         */
    }
}

Successful match will, since we use named subpatterns in regex, fill the $params array almost the same as PHP fills the $_GET array. However, when using a dynamic url, $_GET array is populated without any checks of the parameters.

    /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
    )

These few lines of code and a basic knowing of regular expressions is enough to start building a solid routing system.

Complete source

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' );

this is an .htaccess file that forward almost all to index.php

# 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

then is up to you parse $_SERVER["REQUEST_URI"] and route to picture.php or whatever


PHP is not what you are looking for, check out mod_rewrite


Although already answered, and author's intent is to create a front controller type app but I am posting literal rule for problem asked. if someone having the problem for same.

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

Above should work for url picture.php/Some-text-goes-here/51. without using a index.php as a redirect app.

참고URL : https://stackoverflow.com/questions/16388959/url-rewriting-with-php

반응형