0

私は週末のほとんどの間、.htaccess に頭を悩ませようとしてきましたが、つまずき続けています。サーバーを 1 セットのルールで動作させることができますが、一度に複数のルールを使用することはできません。

私のアプリケーションはいくつかのページで構成されています:

  • ホームページは、オプションのクエリ文字列引数を使用して、詳細ページからコンテンツ (および詳細ページに含まれていないコンテンツ) を取得します。例えば?s=item-name
  • 詳細ページは、オプションのクエリ文字列引数を使用してコンテンツを取得します (ホームページと同じ引数。たとえば、?s=item-nameこれはまったく同じコンテンツを参照します) 。
  • コレクションページ
  • 関連ページ

これらの各ページは、ドキュメント ルート (index.php、detail.php、collection.php、関連する php) にある php ファイルです。

私が達成したいこと:

  • mydomain.com/detail/ユーザーは、代わりにまたはに移動できる必要がありますmydomain.com/detail(したがって、末尾のスラッシュを許可します)mydomain.com/details.php
  • 存在する場合、クエリ文字列引数 ( ?s=item-name) は、ページの末尾のスラッシュの後に入力する必要があります (したがってmydomain.com/item-namemydomain.com/?s=item-name;mydomain.com/detail/item-nameの代わりにmydomain.com/detail.php?s=item-name.

これは、私の.htaccessファイルが現在どのように見えるかです。

<IfModule mod_rewrite.c>  
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

これにより、ホームページは正しいコンテンツを取り込むことができます。どのページでも同じことができるようになるのはそれほど遠くないと確信していますが、私にはそれがよくわかりません.

誰でも助けることができますか?

4

1 に答える 1

1
RewriteEngine On
RewriteBase /

# Specifics
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/([^/]+)/(.+)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^ %1.php?s=%2 [L]

# EDIT 1: This will also check for root pages. See notes below
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^/]+)/ $1 [R=301,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.+) $1.php [L,QSA]

# Everything else
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?s=$1 [L]

説明:

  1. まず、fullREQUEST_FILENAMEが存在しないことを確認します。
  2. 次に、フォーマットが次のようになっていることを確認します: /<something-without-slash>/<everything else>(オプションの末尾のスラッシュ付き)。
  3. 次に、最初の条件キャプチャが PHP ファイルとしてドキュメント ルートに存在するかどうかを確認します。たとえば、 をリクエストすると、存在するfoo/barかどうかがチェックされます/foo.php
  4. 次に、正しいクエリ文字列を使用して、要求を正しいファイルにルーティングするだけです。

したがって、あなたの場合、 をリクエストするdetail/item-nameと、サーバーは実際に を見detail.php?s=item-nameて、応答を提供します。

注:存在しない場合、リクエストは単純に にリクエストを送信しindex.phpます。

編集:ルート ページの検出を追加しました。ただし、この種の検出のためにスラッシュを残すことはできないことに注意してください。これは.php、空のsクエリ パラメータに自動的に修正されるためです。理由はわかりません...これが、この段階に達すると、末尾のスラッシュが削除される理由です。これは、2 つの重複ではなく 1 つのページとして表示されるため、SEO 評価/ランキングにも適しています。

于 2013-05-06T15:23:31.857 に答える