1

多くのパラメーターを使用してサイトを構築しています。現時点では、.htaccess ファイルでこのコードを使用しています。

Options +FollowSymLinks
RewriteEngine on
RewriteBase /epo

RewriteRule (.*)/(.*)/(.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3&param=$4&param2=$5 [QSA]
RewriteRule (.*)/(.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3&subsite=$4 [QSA]
RewriteRule (.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3 [QSA]
RewriteRule (.*)/(.*)/$ index.php?section=$1&content=$2 [QSA]
RewriteRule (.*)/$ index.php?section=$1 [QSA]

RewriteCond %{REQUEST_URI} ^/[^\.]+[^/]$
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L]

私は mod_rewrite が初めてなので、このコードがめちゃくちゃです。これらすべてのパラメータを処理するより良い方法はありますか? 最後の 2 行は、末尾に "/" がない場合に追加するためのものです。誰かが自分のコードを説明してくれれば、私が何を間違えたのか理解できるでしょう:)

4

2 に答える 2

1

これは Hugo の例に似ていますが、GETparamはありません。

<IfModule mod_rewrite.c>
    SetEnv HTTP_MOD_REWRITE On
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
</IfModule>

で次のPHPことができます:

$pathInfo = pathinfo($_SERVER['SCRIPT_NAME']);
$baseUrl = $pathInfo['dirname'];
$baseFile = $pathInfo['basename'];
$url = rtrim(str_replace([$baseUrl, '/'.$baseFile], '', $_SERVER['REQUEST_URI']), '/');
$method = strtolower($_SERVER['REQUEST_METHOD']);
$isModRewrite = array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

URL は次のようになります。

http://www.yourserver.com/param1/param2

または (mod の書き換えが有効になっていない場合)

http://www.yourserver.com/index.php/param1/param2

どちらの方法でも、$url変数は次のようになります/param1/param2

この文字列を処理explodeするか、パラメータを抽出するためにこの文字列を PHP ルーティング ライブラリにフィードします。

PHP ルーティング サンプル ライブラリ:

https://github.com/robap/php-router

https://github.com/deceze/Kunststube-Router

于 2013-03-19T10:54:52.663 に答える
1

個人的には、すべてのリクエストを単一のファイルにリダイレクトし、そこから処理します。

RewriteRule ^(.*)$ index.php?path=$1 [QSA]

そして、index.phpで次のようなものを使用します

$params = explode('/', $_GET['path'];

$section = $params[0];
$content = $params[1];
$site    = $params[2];
$subsite = $params[3];
//etc.

すべてのパラメーターで追加の検証が必要であることに注意してください

于 2013-03-19T10:37:13.163 に答える