web-dev-qa-db-ja.com

2つの例外を除いて、.htaccessファイルにリダイレクトを作成する方法

それで私は長い間これを試みてきました、しかし私はそれを働かせることができないようです。私のウェブサイトはhttps://example.comで、そのほかのページはhttps://example.com/abchttps://example.com/abc-def-gです。上記の2ページを除いて、計画はすべてのページ(存在するページと存在しないページの両方)に対して自動的にホームページにリダイレクトすることです。

私が試みたことはすべて失敗しました、私がウェブサイトにアクセスすることを妨げているか、あるいは全く何もしないことのどちらかです。

現時点でこれは.htaccessファイルです。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
# BEGIN EWWWIO
# END EWWWIO

これはWordPressの標準ファイルです。任意の助けは大歓迎です!

1
N.Hyatt

以下を試してください、before既存のWordPressディレクティブ。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^(abc|abc-def-g)$ / [R,L]

これは、/abcまたは/abc-def-gではなく、物理ファイルまたはディレクトリ(つまり、静的リソース、画像、CSS、JSなど)にマッピングされていないURLについては、ホームページにリダイレクトすることを示しています。

RewriteRulepattern!接頭辞は正規表現を否定します。

これは一時的な(302)リダイレクトです。

RewriteEngine Onディレクティブを繰り返す必要はありません。


更新: あなたのURLが末尾のスラッシュで終わっているなら、あなたはRewriteRulepatternを修正するべきです:

RewriteRule !^(abc|abc-def-g)/$ / [R,L]

または、末尾のスラッシュをオプションにします。

RewriteRule !^(abc|abc-def-g)/?$ / [R,L]

同じことを書く別の方法は(あなたがコメントで述べたように)RewriteCondpatternの代わりにREQUEST_URIサーバー変数をチェックするためにRewriteRulename__ディレクティブを使うことです。これは読みやすくなるかもしれませんが、RewriteRulepatternが常に最初に処理されるため、わずかに効率が悪くなります。例えば:

RewriteCond %{REQUEST_URI} !^/abc/?$
RewriteCond %{REQUEST_URI} !^/abc-def-g/?$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ / [R,L]

これは、(代替を使用して)同じです。

RewriteCond %{REQUEST_URI} !^/(abc|abc-def-g)/?$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ / [R,L]
0
MrWhite