2

ページネーション機能を使用するときに、URL をより適切に処理するために、htaccess でヘルプを探しています。

現在、私の htaccess は次のようになっています。

RewriteEngine On RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule    ^([A-Za-z0-9-]+)/?$    index.php?alias=$1    [QSA,NC,L]
RewriteRule    ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$    index.php?alias=$1/$2    [QSA,NC,L]  

基本的に、私には2つのルールがあります。最初は 2 番目のものしかなく、すべてのリクエストをインデックス ページに送信し、そこで正しいコンテンツを表示するために URL の詳細を解析しました。example.com/bars のようなサブディレクトリが 1 つしかなく、example.com/bars/bar-name のようなディレクトリが 2 つしかない URL では機能しないことがわかったので、その前にルールを追加しました。

これは私にとって非常にうまく機能しています。すべての URL が見栄えがよく、?alias=bars/bars-name は完全に非表示になり、/bars/bars-name のようになります

最近、ページネーションphp機能を統合しました。この関数は、次のような URL を作成します。

example.com/bars?alias=bars&info=mysql_table_bars&page=2

基本的に、'info' はページネーション機能が照会するテーブル名であり、'page' は現在のページです。この機能を使い始めると、「エイリアス」もURLに表示されるようになりました。

私が望むのは、ページネーションが次の例のようになることです。

example.com/bars/page/2
example.com/hotels/page/5
etc...

この状況を処理するには、htaccess に何を追加する必要がありますか? また、既存の 2 つのルールを簡素化する方法はありますか?

4

1 に答える 1

2

あなたの元のルールについて。直後にのみ適用される条件なRewriteRuleので、それらを複製する必要があります。

RewriteEngine On 
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule    ^([A-Za-z0-9-]+)/?$    index.php?alias=$1    [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule    ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$    index.php?alias=$1/$2    [QSA,NC,L]  

新しいページネーションの場合、まず、何らかの方法で検証されていない限り、クエリ文字列からデータベーステーブル名を取得するのは非常に悪いことです(これが起こっている可能性があります)。しかし、それでも、それは依然として情報開示の問題です。したがって、これらのルールを使用して、常にそれらを削除できます。

# This matches the actual request when there's pagination in the query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/\?]+)\?alias=([^&\ ]+)&info=.*&page=([0-9]+)

# an optional sanity check, does the request URI match the "alias" param?
RewriteCond %1:%2:%3 ^(.*):\1:(.*)$

# redirect the browser to the URL with the table name removed
RewriteRule ^ /%1/page/%2? [L,R=301]

次に、クエリ文字列を使用してそれらをリクエストに内部的に書き戻すためのルールが必要です。

# rewrite it back to the query string
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([^/]+)/page/([0-9]+) /$1?alias=$1&info=mysql_table_$1&page=$2 [L]
于 2012-10-26T19:00:37.280 に答える