.htaccess mod_rewrite-書き換えルールからディレクトリを除外する方法


145

.htaccessファイルに8行の書き換えルールがあります。サーバー上の2つの物理ディレクトリをこれらのルールから除外して、それらにアクセスできるようにする必要があります。今のところ、すべてのリクエストはindex.phpファイルに送信されます。

除外するディレクトリ:「admin」と「user」。

したがって、httpリクエスト:http: //www.domain.com/admin/をindex.phpファイルに渡してはいけません。

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

[^/]そこに許可されていない場合はプレーンスペース(でエスケープする必要があります\<space>)以降、量指定子を忘れたと思います。
ガンボ

真のガンボ、良いキャッチ:)。^([^ /] +)である必要があります。
ケルビン

回答:


287

他のルールの前にこのルールを試してください:

RewriteRule ^(admin|user)($|/) - [L]

これで、書き換えプロセスが終了します。


こんにちはガンボ、コードは、ユーザーがdomain.com/admin/(スラッシュで終了)を入力した場合は機能しましたが、それがない場合は機能しませんでした。両方のケースで機能するように何を変更できますか?ありがとう
ケルビン

@ケルビン:代替案($|/)は両方のケースを処理する必要があります。
ガンボ

ここでRewriteRuleの代わりにRewriteCondを使用する方が良いのではないですか?
rineez 2012

7
@rineez RewriteCondは常にRewriteRuleそれがアタッチされていることを必要とします。そして、この条件RewriteCondをすべての否定に追加RewriteRuleすることは非常に大きくなる可能性がありRewriteRule、そのような場合に無視されるべき条件の上に出口として単一を追加する方がよりエレガントです。
ガンボ

3
@Ergec「何も変更しない」という意味です。
ガンボ2013

112

あなたがすることもできることは、.htaccessファイルを含むことです

RewriteEngine Off

(ツリーの上位にある.htaccessファイルのルールによって)書き換えから除外するフォルダー内。シンプルですが効果的です。


18
+1〜.htaccessは階層的に動作するため、CSSまたはMVCの通常のカスケードと同様に、ローカルフォルダーは親をオーバーライドします。
Atari

4
覚えておかなければならないことが1つだけあります。.htaccessファイルをアクティブにする(apache config AllowOverride以外のNone設定)と、apacheはすべてのリクエストで.htaccessを検索します。したがって、頻繁にアクセスするWebサイト/ Webサーバーがある場合、ファイルシステム/ハードディスクへのアクセスがパフォーマンスに大きな影響を与える可能性があります...
bohrsty

ファイル方式によるSSL証明書の更新を検証するための完璧なアドバイス。一時ディレクトリの外やvhostファイルで変更する必要はありません。検証が完了したら、フォルダー全体を削除するだけで完了です。ただ素晴らしい。
Countzero

25

次のように、管理ディレクトリをチェックする条件を追加します。

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

こんにちはロブ、「RewriteBase /」の直後にこの行を置いたところ、「500エラー-内部サーバーエラー」
Kelvin

@Kelvin回答を編集し、適用する各ルールの前に条件を追加します。
Rob

これは実際に私を助けた唯一のものでした。受け入れ答えはなかったではない私を助けて。
Uwe Keim

5

ルールから特定のディレクトリを削除する場合(つまり、ディレクトリfooを削除する場合)は、次のように使用できます。

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

上記のrewriteRuleは、/ foo /に対するリクエストを除くすべてのリクエストを/index.phpにリライトします。

既存のすべてのディレクトリを除外するには、ルールの上で次の条件を使用する必要があります。

RewriteCond %{REQUEST_FILENAME} !-d

次のルール

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

すべて(ディレクトリを除く)を/index.phpに書き換えます。


5

次のmod_rewriteルールを使用しました。

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

これにより、/ testおよび/ my-folderディレクトリ内のリソースへのリクエストを除き、サイトへのすべてのトラフィックがhttp://www.newdomain.comに(301リダイレクトで永久に)リダイレクトされます。(。*)キャプチャグループを使用し、次に$ 1を新しいURLに含めることにより、ユーザーをリクエストした正確なリソースに転送します。スペースに注意してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.