web-dev-qa-db-ja.com

.htaccess URLは2つのパラメーターでフレンドリURLを書き換えます。2番目のパラメーターはオプションです

私はこの部分で立ち往生しており、私はいくつかの支援を得ることを望んでいた。私はPHPでハイスコアページを作成していますが、うまくいきます。しかし、index.php?skill=nameのアイデアが嫌いなので、この中に少しSEOが必要でした。

URLをよりわかりやすいバージョンに正常に置き換えました:
highscores/skill/name

そして、ここから問題が始まります。ハイスコアにページネーションを追加し、ページはHTTP_GETページ変数($_GET['page'])から読み取られます。

私はhighscores/skill/name&page=2のアイデアが嫌いで、皆さんが次のようなURLを作成するのを手伝ってくれることを望んでいました。

ページ1。ページ番号を宣言せずにファイルにアクセスします。

DOMAIN.TLD/highscores/skill/name

ページ> 1なので、ページ変数が必要になります。

DOMAIN.TLD/highscores/skill/name/2

「2」がページ2を定義し、ページ2の正しいデータをロードすることがわかると思いますが、このように構成するために.htaccessファイルに多くの問題があります。

RewriteRule ^highscores\/skill\/(.*?)(\/(.*?)*)$ highscores/skills.php?skill=$1&page=$2 [L] # Skills page

それが動作するようにするための私の最新の試みであり、残念ながら動作せず、ページを恐ろしく見せて(CSSは動作しません)、URLで指定されたページに移動しません。


パート2-最初の問題を解決してくれたw3dのおかげで、2番目の問題に直面しました。最初の問題が解決することを望んでいました。

Highscoresディレクトリのインデックスページには、総合スコアdomain.tld/highscores/が表示されます。しかし、私はdomain.tld/highscores/?page=2のアイデアが好きではありません

domain.tld/highscores/2のようにする方法を教えてください
2はもちろんページ番号です。

私が試したものは次のとおりです。

RewriteRule ^highscores/([^/]+)?$ ./highscores/index.php?page=$1 [L]
1

.htaccess(ドキュメントルート内)で次のことを試してください。

RewriteRule ^highscores/skill/([^/]+)(/([^/]+))?$ /highscores/skills.php?skill=$1&page=$3 [L]
  • highscores/skills.phpはドキュメントのルートから物理的に配置されていると想定しているため、このURLを置換でルート相対にしています。ここでは相対URLを使用すると問題が発生する可能性があり、RewriteBaseの使用が必要になる場合があります。

  • これで、ページ番号の部分は完全にオプションになりました。以前は、ページ番号が省略された場合は一致しませんでした。例えば。 DOMAIN.TLD/highscores/skill/name(おそらくページコードの「空」または1を確認する必要があります。)

  • 正規表現は、任意の文字ではなく、URLセクションの/(パス区切り記号)以外のものと一致します。

  • $3(スラッシュを含む2番目のかっこ付きパターン)ではなく、$2(かっこ付きサブサブパターン)をキャプチャします。

  • ステートメントの最後にインラインコメントを含めないでください。これにより、Apacheの以降のバージョンが破損する可能性があります。

CSSが機能しないのは、おそらくCSSファイルへの相対パスを使用しているためでしょうか?この場合、ブラウザは、ページ番号が含まれているかどうかに応じて、2または3フォルダの深さであるとみなしますが、skills.phpの深さは1フォルダのみです(あなたはおそらくあなたのCSSファイルを参照しています)。代わりにルート相対URLを使用してください。


PART 2-質問の2番目の部分への回答で... 500内部サーバーエラーの理由は、2つのルールが競合しているため、書き換えループが発生することです。 2番目のRewriteRuleanythingではなく、ページnumberを具体的にチェックすることで、このインスタンスの競合を回避できます。

RewriteRule ^highscores/(\d+)?$ /highscores/index.php?page=$1 [L]
  • (\d+)数字のみをチェックします(つまり、ページ番号のみにすることができます)

  • 置換パスの接頭辞.も削除しました。

1
MrWhite