web-dev-qa-db-ja.com

PHPでフレンドリーなURLを作成する方法は?

通常、プロファイルページを表示する方法または非常に古い方法は次のとおりです。

www.domain.com/profile.php?u=12345

ここで、u=12345はユーザーIDです。

近年、次のような非常に素晴らしいURLを含むWebサイトを見つけました。

www.domain.com/profile/12345

PHPでこれを行うにはどうすればよいですか?

当たり前のように、.htaccessファイルと関係があるのでしょうか? .htaccessファイルの書き方に関するヒントやサンプルコードを教えてください。

63
Peter

この記事 によると、mod_rewrite(.htaccess file)次のようなルール:

RewriteEngine on
RewriteRule ^/news/([0-9]+)\.html /news.php?news_id=$1

そして、これはからのリクエストをマッピングします

/news.php?news_id=63

/news/63.html

別の可能性は、forcetypeでそれを行うことです。だから、あなたの.htaccessファイル、以下を入力します。

<Files news>
    ForceType application/x-httpd-php
</Files>

そして、index.phpは$_SERVER['PATH_INFO']変数:

<?php
    echo $_SERVER['PATH_INFO'];
    // outputs '/63.html'
?>
44
cgp

私は最近、自分のニーズに合ったアプリケーションで次を使用しました。

.htaccess

<IfModule mod_rewrite.c>
# enable rewrite engine
RewriteEngine On

# if requested url does not exist pass it as path info to index.php
RewriteRule ^$ index.php?/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?/$1 [QSA,L]
</IfModule>

index.php

foreach (explode ("/", $_SERVER['REQUEST_URI']) as $part)
{
    // Figure out what you want to do with the URL parts.
}
28
Jordan S. Jones

次の例では、この問題を段階的に説明しようとします。

)質問

私はあなたにこのように尋ねようとします:

facebookプロフィールwww.facebook.com/kaila.piyushのようなページを開きたい

uRLからIDを取得してprofile.phpファイルに解析し、データベースからfeatchデータを返し、ユーザーをプロファイルに表示します

通常、Webサイトを開発すると、そのリンクはwww.website.com/profile.php?id=username example.com/weblog/index.php?y=2000&m=11&d=23&id=5678のようになります

今、私たちはパーマリンクとしてwww.website.com/usernameまたはexample.com/weblog/2000/11/23/5678を使用して書き換えない新しいスタイルで更新

http://example.com/profile/userid (get a profile by the ID) 
http://example.com/profile/username (get a profile by the username) 
http://example.com/myprofile (get the profile of the currently logged-in user)

1).htaccess

ルートフォルダーに.htaccessファイルを作成するか、既存のファイルを更新します。

Options +FollowSymLinks
# Turn on the RewriteEngine
RewriteEngine On
#  Rules
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php

それは何をしますか?

要求が実際のディレクトリまたはファイル(サーバー上に存在するもの)に対するものである場合、index.phpは提供されません。それ以外の場合、すべてのURLはindex.phpにリダイレクトされます。

2)index.php

ここで、トリガーするアクションを知りたいので、URLを読み取る必要があります。

Index.phpで:

// index.php    

// This is necessary when index.php is not in the root folder, but in some subfolder...
// We compare $requestURL and $scriptName to remove the inappropriate values
$requestURI = explode(‘/’, $_SERVER[‘REQUEST_URI’]);
$scriptName = explode(‘/’,$_SERVER[‘SCRIPT_NAME’]);

for ($i= 0; $i < sizeof($scriptName); $i++)
{
    if ($requestURI[$i] == $scriptName[$i])
    {
        unset($requestURI[$i]);
    }
}

$command = array_values($requestURI);
With the url http://example.com/profile/19837, $command would contain :

$command = array(
    [0] => 'profile',
    [1] => 19837,
    [2] => ,
)
Now, we have to dispatch the URLs. We add this in the index.php :

// index.php

require_once("profile.php"); // We need this file
switch($command[0])
{
    case ‘profile’ :
        // We run the profile function from the profile.php file.
        profile($command([1]);
        break;
    case ‘myprofile’ :
        // We run the myProfile function from the profile.php file.
        myProfile();
        break;
    default:
        // Wrong page ! You could also redirect to your custom 404 page.
        echo "404 Error : wrong page.";
        break;
}

2)profile.php

これで、profile.phpファイルに次のようなものが表示されます。

// profile.php

function profile($chars)
{
    // We check if $chars is an Integer (ie. an ID) or a String (ie. a potential username)

    if (is_int($chars)) {
        $id = $chars;
        // Do the SQL to get the $user from his ID
        // ........
    } else {
        $username = mysqli_real_escape_string($char);
        // Do the SQL to get the $user from his username
        // ...........
    }

    // Render your view with the $user variable
    // .........
}

function myProfile()
{
    // Get the currently logged-in user ID from the session :
    $id = ....

    // Run the above function :
    profile($id);
}
14
Piyush

これを行う簡単な方法。このコードを試してください。 htaccessファイルにコードを入れます:

Options +FollowSymLinks

RewriteEngine on

RewriteRule profile/(.*)/ profile.php?u=$1

RewriteRule profile/(.*) profile.php?u=$1   

このタイプのきれいなURLを作成します:

http://www.domain.com/profile/12345/

より多くのhtaccessプリティURLの場合: http://www.webconfs.com/url-rewriting-tool.php

8
Hemal Halari

これは実際にはPHPではなく、mod_rewriteを使用するApacheです。何が起こるかは、リンクwww.example.com/profile/12345をリクエストし、Apacheが書き換えルールを使用してそれを切り刻み、www.example.com/profile.php?u = 12345のようにします。サーバ。詳細はこちらをご覧ください: Rewrite Guide

4
jacobangel

Mod_Rewriteだけが答えではありません。 .htaccessでOptions + MultiViewsを使用し、$_SERVER REQUEST_URIをチェックしてURLにあるすべてのものを見つけることもできます。

0
empi

これを行うにはさまざまな方法があります。 1つの方法は、前述のRewriteRuleテクニックを使用してクエリ文字列値をマスクすることです。

私が本当に好きな方法の1つは、 フロントコントローラー パターンを使用する場合、 http://yoursite.com/index.php/path/to/yourのようなURLも使用できることです。/page/here そして、$ _ SERVER ['REQUEST_URI']の値を解析します。

次のコードを使用して、/ path/to/your/page/hereビットを簡単に抽出できます。

$route = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME']));

そこから、どのように解析してもかまいませんが、ピートのために必ずサニタイズしてください;)

0
Shabbyrobe