0

クライアントがサイトにページを追加するとき、新しいページ名をRewiteRule正規表現に追加する必要があります。したがって、たとえばfwrite()を使用して、データベースから撤回された値でそのRewiteRule正規表現をPHPに変更させたいと思います。これが可能である場合、プロセスに落とし穴はありますか?

編集:PHPスクリプトでの処理が解決策になりますが、それ以上の処理がない場合は...最初のdomain / index.php?page =pagenameは「domain/pagename」に301リダイレクトされ、訪問者にこのページが恒久的に移動-(これはURLの古い公開場所であり、これに301を与える必要があります)。次に、「domain / pagename」(新しいパブリックロケーション)などのリクエストは、サイレントに内部的にdomain / index.php?page = pagenameに書き換えられ、検証が行われ、無効な場合は404が指定されます。ただし、キー、?page = pagenameの「page」部分は静的であり、検証でき、.htaccess内から直接404を提供します。これで、domain / index.php?page = crapのようなリクエストは、最初に、有効なdomain / index.php?page = pagenameのように、インデックスに到着したときにのみ、301をうまく提供します。phpはがらくたとして識別できます。したがって、データベースから.htaccess内にページ名を取得する必要があります。

これは、この問題の背景を説明するための.htaccesコンテンツのサンプルです。

ErrorDocument 404 http://localhost/testsite/404.php

RewriteEngine on
RewriteBase /testsite/

## block craprequests without extension like domain/crap > 404  
# The requests domain/pagename that do not go to existing pages, will now be redirected with a 302 to index.php?page=pagename and only then give a 404 through the errorcheck in the code.
# This should be done here, with a RewriteCond regex with database content
RewriteCond %{REQUEST_URI} !404.php$
RewriteRule .* 404.php [R=404,L]

## block-direct-queries ##
RewriteCond %{QUERY_STRING} !marker=1$
RewriteCond %{QUERY_STRING} page=(.*)
RewriteRule ^.*$ %1? [R=301,L]


## strip-extensions ##
RewriteCond %{QUERY_STRING} !.
RewriteCond %{REQUEST_URI} !404.php$
RewriteRule ^([\w+%*\d*\+*\-*]+)\.(php[\s]{0,3}|htm[\s]{0,3}|html[\s]{0,3})$ $1 [R=301,L]

## put-querystring
RewriteRule ^([\w\-_]+)\/?$ index.php?page=$1&marker=1 [L]
4

2 に答える 2

2

これを繰り返して申し訳ありませんが、.htaccessにページ名を保存する必要はありません。これはすべて、PHPではるかに簡単に実行できます。

必要な唯一の書き換えルールは次のとおりです。

RewriteCond %{REQUEST_URI} !^/?index\.php$
RewriteRule .* /index.php [L,QSA]

これで、PHPでは、次のようなことができます。

// The important point here is that $_SERVER['REQUEST_URI'] contains the actual
// path the user typed into their browser, which is what you are interested in

if (strtolower(basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) === 'index.php') {
    // The user directly requested index.php
    if (!empty($_GET['page']) || value_of_page_is_crap()) {
        // The user requested a bad page
        header("{$_SERVER['SERVER_PROTOCOL']} 404 Not Found");
    } else {
        // Redirect to correct URL
        header("{$_SERVER['SERVER_PROTOCOL']} 301 Moved Permanently");
        header("Location: http://{$_SERVER['HTTP_HOST']}/{$_GET['page']}");
    }
    exit;
}

// The request is allowed to continue
$requestedPage = pathinfo($_SERVER['REQUEST_URI'], PATHINFO_FILENAME);

.htaccessは、すべてのリクエストを盲目的にPHP経由でルーティングします。この場合、mod_rewriteの不格好なPCREベースのルールよりもはるかに正確なロジックを使用できます。

PHPスクリプトは、ユーザーがブラウザーのアドレスバーに入力したURIを調べます。直接リクエストした場合は、適切な値が含まれているindex.phpかどうかを確認し、$_GET['page']含まれている場合は正しいURLにリダイレクトし、404で応答しない場合は、ユーザーがindex.phpを直接リクエストしなかった場合、スクリプトを続行できます。彼らが要求したページの価値をどのように抽出できるかを示す例の行を追加しましたが、ここからどのように続行するかはあなた次第です。

于 2012-08-15T10:00:22.547 に答える
1

これはおそらく可能です(ただし、書き込み権限が問題になる場合があります)。ただし、クライアントからのすべてのリクエストをindex.phpファイルを介してルーティングし、PHPにルーティングを処理させる方がよい方法ではありません。

このようにして、最大限の柔軟性が得られ、「ハッキー」なことをする必要がなくなります。

編集

リダイレクトのすべての形式は、PHPから実行できます。301リダイレクトの例:

header ('HTTP/1.1 301 Moved Permanently');
header ('Location: http://example.com/new/path'); // note the full address
exit();

の使用の詳細については、マニュアルを参照してくださいheader()

于 2012-08-14T11:35:19.377 に答える