PHP は疑似静的 URL を実装します。プロセス全体が詳しく説明されています
?
URL を静的にするには、Apache、nginx、htaccess などを使用しますが、PHP を使用して静的 URL を実現することはほとんどありません。PHP を使用して静的 URL を実現することは、個人的には推奨しません。静的 URL
?
1. URL の静的実装の原則
?
1. 動的 URL を静的 URL に変換するプログラムを使用します。変換方法は統一されたインターフェイスであることが望ましいです。静的 URL を HTML に配置すると、ページを通して見えるものが静的 URL になります。
?
2. Apache などで、書き換えモジュールをロードし、書き換えルールを追加します。このようにして、ページ内の静的 URL をクリックすると、正しい URL にリダイレクトできます。 PHP ファイルは引き続き実行されますが、ブラウザーのアドレス バーに表示される静的 URL はそのまま残ります。
?
php を使用して静的 URL を実現する場合は、アドレスバーにも静的 URL を保持する必要があります。これはさらに面倒な例です。
?
?
2 番目に、動的 URL を静的 URL に変換します
?
?
<?php //将url转换成静态url function url_rewrite($file,$params = array (),$html = "",$rewrite = true) { if ($rewrite) { //开发阶段是不要rewrite,所在开发的时候,把$rewrite = false $url = ($file == 'index') ? '' : '/' . $file; if (!empty ($params) && is_array($params)) $url .= '/' . implode('/', $params); if (!empty ($html)) $url .= '.' . $html; } else { $url = ($file == 'index') ? '/' : '/' . $file; if (substr($url, -4) != '.php' && $file != 'index') $url .= '.php'; if (!empty ($params) && is_array($params)) $url .= '?' . http_build_query($params); } return $url; } echo url_rewrite('test.php',array('class'=>"User",'act'=>'check','name'=>'tank')); //$rewrite = false的情况下,显示如下/test.php?class=User&act=check&name=tank echo url_rewrite('test.php', array ('class'=>"User",'act'=>'check','name'=>'tank')); //$rewrite = true的情况下,显示如下/test.php/User/check/tank echo url_rewrite('test', array ('class'=>"User",'act'=>'check','name'=>'tank')); //$rewrite = true的情况下,显示如下/test/User/check/tank echo url_rewrite('test', array ('class'=>"User",'act'=>'check','name'=>'tank'),'html'); //$rewrite = true的情况下,显示如下/test/User/check/tank.html ?> <a href="./test3<?php echo url_rewrite('test.php',array('class'=>"User",'act'=>'check','name'=>'tank'));?>">test</a>
上記は、動的 URL を静的 URL に変換するメソッドを記述しているだけで、次のようにページにリンクが生成されます。
??
?
<a href="./test3/test.php/User/check/tank">test</a>
?
三、統一された入口を指定する
??
?
RewriteCond %{REQUEST_FILENAME} !-f //找不到文件 RewriteCond %{REQUEST_FILENAME} !-d //打不到目录 RewriteRule . /test3/index.php [L]
.htaccess で実装する場合でも、Apache などの設定ファイルに記述する場合でも、すべてが可能です。上記の 3 つの文は、ディレクトリが見つからない場合は、index.php ファイルに移動します。ファイルが見つからない場合は、index.php に移動します。
?
これを実行した後、http://localhost/test3/test.php/User/check/tank にアクセスすると、index.php にリダイレクトされます。php ファイルがわかったので、次のことは簡単です。ハンドル。 。
?
以下の内容は全て http://localhost/test3/test.php/User/check/tank を書き換えて動作させており、他の方法も同様です。
?
?
4、index.php ファイル
??
?
<?php $filename = $_SERVER['REQUEST_URI']; //请求的url /**请求的url,"/test3/test.php/User/check/tank" * test.php 要去的php文件 * User 是class名 * check 是class中的方法名 * tank 是要传到check的参数*/ preg_match("/(\w+\.php)/",$filename,$match); //查找php文件名 $array = explode('/',$filename); //将静态url进行分割 $key = array_keys($array,$match[0]); //得到文件所对应的下标Array ( [0] => 2 ) $file_array = array_slice($array,0,$key[0]+1); //Array ( [0] => [1] => test3 [2] => test.php ) $param_array = array_slice($array,$key[0]+1); //Array ( [0] => User [1] => check [2] => tank ) $file_path = implode('/',$file_array); if($array[$key[0]] != "index.php"){ include_once($array[$key[0]]); //包函请求url中的php文件,在这里是test.php } if(class_exists($param_array[0])){ //判断一下test.php这个文件中有没有User这个class $obj = new $param_array[0]; if(method_exists($obj,$param_array[1])){ //判断一下User这个class中有有没有check这个方法 $obj->$param_array[1]($param_array[2]); //调用这个方法,结果是(我的名子叫tank) } } ?>
5. test.php ファイル
??
?
<?php class User { public function check($name){ echo "我的名子叫".$name; } } ?>
ここで、URL http://localhost/test3/test.php/User/check/tank にアクセスすると、
?
結果は次のとおりです。私の名前はタンクで、アドレス バーは静的なままです。
?
ここでは、php による簡単な URL 書き換えプロセスを完了しました。実際、私たちは今でも .htaccess や Apache などを使用していますが、書き換えルールは .htaccess や Apache にはありません。完全にPHPで静的URLを実現するとなると、個人的には無理な気がします。
?
?
出典: http://blog.51yip.com/php/1219.html
?
?
?
?
?
?
?
?
?
?
?
?
?