.htaccess書き換えルールの予期しない動作

Mar 06 2020

URLパスをindex.phpクエリパラメータに変換するために、いくつかの.htaccess書き換えルールを実行しています。

だから基本的に誰かが訪問したときhttps://example.com/electionsURLをに変換しますhttps://example.com/?page=elections

Options -Indexes

RewriteEngine on

# Ignore extensions
RewriteCond %{REQUEST_URI} !\.(css|js|jpg|png|gif|svg|pkg)$ [NC] RewriteRule ^([^/]+/[^/]+/). $1 [R=301,L]

# Rewrite
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]+)$ /index.php?page=$1 [L,QSA]

これはうまくいきます!問題は1つだけです。これは、訪問者が入力したURLにスラッシュが3つ以上ある場合の予期しない動作です。

だから誰かが訪問したときhttps://example.com/one/two/threeURLをに変換しますhttps://example.com/C:/xampp/htdocs/project/test/test/(ローカルホストテスト)。

この予期しない動作の代わりに通常の404を返すようにするにはどうすればよいですか?

(2つのスラッシュではそれができないので奇妙です)

回答

anubhava Mar 07 2020 at 22:11

将来の訪問者が解決策を見つけやすいように、私のコメントを回答に変換します。

問題は301、この不要なリダイレクトを引き起こした最初のエラーと、間違ったターゲットURLへのリダイレクトが原因です。

このコードは.htaccessに保存できます。

Options -Indexes
RewriteEngine on

# Rewrite
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]+)/?$ index.php?page=$1 [L,QSA]

古いブラウザのキャッシュを回避するために、ブラウザのキャッシュをクリアした後にテストするか、新しいブラウザでテストしてください。