PHP로 URL 재 작성
PHPPHP로 URL 재 작성
다음과 같은 URL이 있습니다.
url.com/picture.php?id=51
해당 URL을 다음으로 변환하는 방법은 무엇입니까?
picture.php/Some-text-goes-here/51
나는 WordPress가 똑같이한다고 생각한다.
PHP에서 친숙한 URL을 만들려면 어떻게해야합니까?
해결법
-
==============================
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.
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.
거의 모든 것을 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.
PHP가 당신이 찾고있는 것이 아니며, mod_rewrite를 확인하십시오.
-
==============================
5.
이미 답변되었지만 작성자의 의도는 전면 컨트롤러 유형 앱을 만드는 것이지만 문제에 대한 문자 적 규칙을 게시하고 있습니다. 같은 문제가있는 사람.
RewriteEngine On RewriteRule ^([^/]+)/([^/]+)/([\d]+)$ $1?id=$3 [L]
위 그림은 url picture.php / Some-text-goes-here / 51에서 작동합니다. index.php를 리디렉션 앱으로 사용하지 않아도됩니다.
from https://stackoverflow.com/questions/16388959/url-rewriting-with-php by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
PHP에서 두 문자열을 결합하는 방법은 무엇입니까? (0) | 2018.09.01 |
---|---|
mysql에 행이 있는지 확인하십시오. (0) | 2018.09.01 |
PHP의 죽음의 흰색 화면 (0) | 2018.09.01 |
배열을 IN () 조건에 바인딩 할 수 있습니까? (0) | 2018.09.01 |
JavaScript 변수를 PHP로 전달하는 방법 (0) | 2018.09.01 |