경로를 변경하려는 경우 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]
이 파일에는 네 가지 지시문이 있습니다.
RewriteEngine
-재 작성 엔진 사용
RewriteRule
- inc/
폴더의 모든 파일에 대한 액세스를 거부 하고 해당 폴더에 대한 호출을index.php
RewriteCond
-이미지, CSS 또는 스크립트와 같은 다른 모든 파일에 직접 액세스 할 수 있습니다.
RewriteRule
-다른 것을 리디렉션 index.php
index.php
모든 것이 이제 index.php로 재 지정되므로, 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 )
*/
}
}
성공적인 일치는 정규 표현식에서 명명 된 하위 패턴을 사용하기 $params
때문에 PHP가 $_GET
배열을 채우는 것과 거의 동일하게 배열을 채 웁니다 . 그러나 동적 URL을 사용하는 $_GET
경우 매개 변수를 확인하지 않고 배열이 채워집니다.
/ picture / some + text / 51
정렬
(
[0] => / picture / 일부 텍스트 / 51
[text] => 일부 텍스트
[1] => 일부 텍스트
[id] => 51
[2] => 51
)
picture.php? text = some + text & id = 51
정렬
(
[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' );