URL書き換えルールを使用して管理ディレクトリがリダイレクトされないようにする

Oct 30 2020

以下の設定は非常にうまく機能しますが、そこに行こうとすると、WordPress Webサイトにログインできなくなるためhttps://example.com/quotes/wp-adminhttps://example.com/wp-adminこれは私が望んでいることではありません/quotes/

これを引用符に 追加しようとしましたが、.htaccess役に立ちません:

RewriteCond %{REQUEST_URI} !^/(wp-admin/.*)$

また.htaccesswp-adminフォルダ内のファイルに次の行を追加しようとしましたが、機能しませんでした。

RewriteEngine Off

ルート.htaccessファイル:

# Rewrite any URLs that contain a language code prefix to the subdirectory
RewriteRule ^[a-z]{2}/ quotes%{REQUEST_URI} [L]


# Rewrite any request for a static resource that does not exist (in the root)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.(css|js|png|jpg|webp|gif|svg|ttf|woff2)$ quotes%{REQUEST_URI} [L]


# BEGIN rlrssslReallySimpleSSL rsssl_version[3.3.5]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
<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

/quotes .htaccess ファイル

# Redirect any direct requests for "/quotes/<anything>" back to root
# Except for static resources
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|webp|gif|svg|ttf|woff)$ RewriteRule (.*) /$1 [R=301,L]


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

回答

2 MrWhite Oct 30 2020 at 17:00

これを引用符に追加しようとしましたが、.htaccess役に立ちません:

RewriteCond %{REQUEST_URI} !^/(wp-admin/.*)$

REQUEST_URIサーバー変数は、完全なURLパスが含まれているので、これはする必要があります/quotes/wp-admin(つまり、正規表現。!^/quotes/wp-admin-意図的に省略末尾のスラッシュ)。その結果、上記の例外は失敗し、リダイレクトは引き続き発生します。

.php回避する拡張機能のリストに追加することもできます。または、ページのURLに「ファイル拡張子」がないと仮定して、ファイル拡張子が付いているように見えるリクエストを除外することもできます。

たとえば、/quotes/.htaccess

# Redirect any direct requests for "/quotes/<anything>" back to root
# Except for wp-admin and static resources
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^/quotes/wp-admin
RewriteCond %{REQUEST_URI} !\.\w{2,4}$ RewriteRule (.*) /$1 [R=302,L]

\.\w{2,4}$-これは、ファイル拡張子が範囲内に2〜4文字に続くドットで構成を前提としa-zA-Z0-9または_(下線)とURLパスの末尾。\wその範囲の文字を表す省略形の文字クラスです。

以下のための上記の例外が、あなたはまた、さらに一歩これを取るとリダイレクトされる物理ファイルにマップするすべての要求を防ぐことができる!^/quotes/wp-admin/とは!\.\w{2,4}$すでにキャッチしなければならないすべてのものを。例えば:

# Redirect any direct requests for "/quotes/<anything>" back to root
# Except for wp-admin, static resources and any other files
RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{REQUEST_URI} !^/quotes/wp-admin RewriteCond %{REQUEST_URI} !\.\w{2,4}$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /$1 [R=302,L]

ファイルシステムチェック(など-f)は比較的「高価」であるため、厳密に必要でない場合は避けるのが最善です。

また、wp-adminフォルダーの.htaccessファイルに次の行を追加しようとしましたが、機能しませんでした。

RewriteEngine Off

これは機能するはずでした-少なくともによってトリガーされるリダイレクトを防ぐために.htaccess。(これにより、書き換えも防止されますが、望ましくない場合がありますか?)

ただし、これは301(永続的)リダイレクトであるため、ブラウザーによって(永続的に)キャッシュされます。したがって、テストする前に、ブラウザのキャッシュがクリアされていることを確認する必要があります。

潜在的なキャッシュの問題を回避するためにすべてが意図したとおりに機能するまで、302(一時)リダイレクトでテストします。


余談:ルート.htaccessファイル内:

# Rewrite any request for a static resource that does not exist (in the root)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.(css|js|png|jpg|webp|gif|svg|ttf|woff2)$ quotes%{REQUEST_URI} [L]

マイナーポイントですwoff2woff、ここで参照しましたが、/quotes/.htaccessファイル内です。理想的には、これらは同じである必要があります。上記の/quotes/.htaccessファイルのように、これを一般化することができます。例えば:

# Rewrite any request for a static resource that does not exist (in the root)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.\w{2,4}$ quotes%{REQUEST_URI} [L]