Habréに関する適切な記事を見つけられなかったため、このギャップを埋めて、Apacheのmod_rewriteなどのすばらしいツールについてさらに詳しく説明することにしました。 美しいURLを作成する複雑さをすべて説明するのではなく、ApacheでのPOSIXのような正規表現パーサーの操作を説明します。 この中で、mod_rewriteに関する最後の記事ではなく、使用の問題について詳しく説明したいと思います。 要するに-なぜmod_rewriteと小さな例でそれが与えるもの。
問題
私の活動では、多くのプログラマーが、無知であったり、ツールを全力で使用したがらないために、ソースのナンセンスをだまし始めた面白い瞬間に出くわしました。 具体的な例として、ほとんどすべての「マルチプラットフォームマルチタスクスクリプト、CMSでもこの種類のものでも、着信URLをコンポーネントに解析するための何らかの方法を見つけました。
しかし、最大のプロジェクトであっても、ナビゲートするURLの数は任意の数によって制限されます。 そして、それらのほとんどに正規表現を完全に通過できる繰り返し要素(たとえば、idまたはその他の「代替」)が含まれていることを考慮すると、「基本」URLの非常に小さなセットが取得されます。プロジェクト全体を構築しました。
実際、プロジェクトのホスティングにmod_rewriteが存在しないことは、長い間マナーが悪いと考えられてきました。 それでは、この素晴らしいツールを使用してみませんか?
解決策
ここで、開発者は明らかに問題に直面しています-mod_rewriteを調べるか、スクリプト言語の側でURLパーサーを使用/作成します。
主な間違いと主な間違いは、このためになじみのないmod_rewriteを使用するためにユニットが使用されることです。
1.パーサーURL
:
RewriteRule ^(.*)$ index.php?param=$1 [QSA,L]
:
RewriteRule ^/pages/([0-9A-z_]{1,64}).html$ index.php?mod=Pages&page_link=$1 [QSA,L]
:
- , . mod_rewrite , , .
- , , , , , . URL — mod_rewrite. , .
2.
mod_rewrite — . , . — . , , , URL, id id ?
, . mod_rewrite :
RewriteRule ^/products/([0-9]{1,8}).html$ index.php?mod=Products&product_id=$1 [QSA,L]
RewriteRule ^(.*)$ index.php?mod=Errors&error_id=404 [QSA,L]
, , . ? , , , , Apache. — , - .
3. -
, mod_rewrite .
RewriteRule ^(.*)/(.*)/var=([^/]+)/ $1/$2 [E=VAR:$3]
Apache , GET-. , , POST GET , -.
„“ — .
mod_rewrite :
mod_rewrite phpclub.ru.
, Apache mod_rewrite — Web- Linux-Apache based . . , .
P.S.
1. , . Rewrite Guide. — .
2. - — , mod_rewrite , - . — .
3. . — ^_^
UPDATE
. , . .
Test Cases:
1. PHP Native
.htaccess:
RewriteEngine On
Options +FollowSymlinks
RewriteBase /
RewriteRule ^(.*)$ index.php?params=$1 [QSA]
index.php:
<?php
$URI = $_GET['params'];
$params = array_values(array_filter(explode('/', $URI)));
print_r($params);
2. Apache mod_rewrite
.htaccess:
RewriteEngine On
Options +FollowSymlinks
RewriteBase /
RewriteRule ^([A-z0-9]{0,})/([A-z0-9]{0,})/([A-z0-9]{0,})/([A-z0-9]{0,})/([A-z0-9]{0,})/([A-z0-9]{0,})/([A-z0-9]{0,})/([A-z0-9]{0,})/$ index.php?0=$1&1=$2&2=$3&3=$4&4=$5&5=$6&6=$7&7=$8 [QSA,L]
index.php:
<?php
print_r($_GET);
3. PHP preg_match
htaccess:
RewriteEngine On
Options +FollowSymlinks
RewriteBase /
RewriteRule ^(.*)$ index.php?params=$1 [QSA]
index.php:
<?php
$URI = $_GET['params'];
preg_match ( "/([A-z0-9]{0,})\/([A-z0-9]{0,})\/([A-z0-9]{0,})\/([A-z0-9]{0,})\/([A-z0-9]{0,})\/([A-z0-9]{0,})\/([A-z0-9]{0,})\/([A-z0-9]{0,})\//" , $_GET['params'], $params);
print_r($params);
:
. Apache Bench :
ab -c 10 -n 100000 test.com/param/val/param1/val/param2/val/param3/val
:
:
kasumi ~ # uname -a
Linux kasumi 2.6.24-tuxonice-r9 #1 SMP Sun Jul 13 02:57:59 Local time zone must be set--see zic i686 Intel(R) Pentium(R) M processor 1.60GHz GenuineIntel GNU/Linux
kasumi ~ # lshw
kasumi
description: Notebook
product: SX10P
vendor: Samsung Electronics
*-cpu
description: CPU
product: Intel(R) Pentium(R) M processor 1.60GHz
*-memory
description: System Memory
physical id: e
slot: System board or motherboard
size: 768MiB
*-disk
description: ATA Disk
product: HTS424040M9AT00
vendor: Hitachi
physical id: 0
bus info: ide@0.0
logical name: /dev/hda
version: MA2OA71A
serial: MPA241Q2DPTHJA
size: 37GiB (40GB)
kasumi ~ # apache2 -v
Server version: Apache/2.2.8 (Unix)
Server built: Jun 13 2008 20:05:00
kasumi ~ # php -v
PHP 5.2.6-pl7-gentoo (cli) (built: Oct 18 2008 13:21:57)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
:
1. PHP Native:
Requests per second: 1570.26 [#/sec] (mean)
Time per request: 6.368 [ms] (mean)
Time per request: 0.637 [ms] (mean, across all concurrent requests)
2. Apache mod_rewrite:
Requests per second: 1579.41 [#/sec] (mean)
Time per request: 6.331 [ms] (mean)
Time per request: 0.633 [ms] (mean, across all concurrent requests)
3. PHP preg_match
Requests per second: 1528.33 [#/sec] (mean)
Time per request: 6.543 [ms] (mean)
Time per request: 0.654 [ms] (mean, across all concurrent requests)
, , mod_rewrite , PHP.