web-dev-qa-db-ja.com

HTACCESSはクエリ文字列を含むURLをリダイレクトします

基本的に、/stats.php?player=nameと入力するだけでhttps://domain.com/@nameにアクセスできます。ただし、/stats.php?player=nameにリダイレクトするには、古いhttps://domain.com/@nameリンクも必要です。

どうすればいいですか?以下は私の.htaccessファイルです。

<IfModule mod_rewrite.c>
ErrorDocument 404 /404.php
RewriteRule ^@(\w+)$ stats.php?player=$1
Options +FollowSymlinks
Options -MultiViews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
</ifModule>
2
Dalton Edwards

この場合、すでに「きれいな」URLを「lyい/本物の」URLに書き換えている場合、redirectTHE_REQUESTをチェックすることで、きれいなURLのいURLにできます。これには、書き換えが行われる前の元のHTTPリクエストが含まれます。そうしないと、いURLに書き戻すときに、書き換えループが作成される危険があります。例えば:

RewriteCond %{THE_REQUEST} \?player=(\w+)\ HTTP
RewriteRule ^stats\.php$ /@%1? [R=301,L]

通常、外部リダイレクトは内部書き換えの前に行われる必要があります。

RewriteRuleディレクティブではなくRewriteCondパターンで「stats.php」をチェックすると、すべての単一のリクエストを処理しないことでサーバーの負荷が軽減されます(RewriteRuleが最初に処理されます)。 %1は、RewriteCondパターンの最初の括弧で囲まれたサブパターンを指します。そして、末尾の?(空のクエリ文字列)は、書き換えられた置換からクエリ文字列を本質的に削除します。

また、Lフラグを追加し、スラッシュを前に付けることで現在のRewriteRuleルートを相対的にします(このファイルがサイトのルートにあると仮定します)。相対URLは.htaccessファイルで問題になる可能性があります。

RewriteRule ^@(\w+)$ /stats.php?player=$1 [L]

また、OptionsおよびRewriteEngineディレクティブを最上部に移動します。

ErrorDocument 404 /404.php

Options +FollowSymlinks
Options -MultiViews

RewriteEngine On

RewriteCond %{THE_REQUEST} \?player=(\w+)\ HTTP
RewriteRule ^stats\.php$ /@%1? [R=301,L]

RewriteRule ^@(\w+)$ /stats.php?player=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ /$1.php [NC,L]

(最後のRewriteRule置換でもスラッシュを使用しました。relative URLを使用する場合は、RewriteBaseディレクティブも指定する必要があります。)

<IfModule mod_rewrite.c>のチェックもおそらく不要です。このモジュールが利用可能な場合にのみErrorDocumentおよびOptionsを設定したい場合を除きます!?

2
MrWhite