web-dev-qa-db-ja.com

mod_rewriteでディレクトリを無視するにはどうすればよいですか?

Modrewriteルールにディレクトリvipをスキップさせようとしています。以下に示すように、いくつかのことを試しましたが、役に立ちませんでした。

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

Modrewriteで/vip/ディレクトリを完全に無視して、すべての要求がフォルダーに直接渡されるようにするにはどうすればよいですか?

更新:

明確化のポイントとして:

  • Dreamhostでホストされています
  • フォルダーはwordpressディレクトリー内にあります
  • / vip /フォルダーにはwebdav .htaccessなどが含まれています(これは重要だとは思いませんが)
73
user24557

これを他のルールの前に置いてみてください。

_RewriteRule ^vip - [L,NC] 
_

vipで始まるURIに一致します。

  • _-_は何もしないことを意味します。
  • Lは、これが最後のルールであることを意味します。以下をすべて無視します。
  • NCは、大文字と小文字を区別しないことを意味します(「VIP」も一致します)。

どんなものにも一致することに注意してくださいbeginningvip。式_^vip$_はvipと一致しますが、_vip/_または_vip/index.html_とは一致しません。 _$_はあなたの没落であったかもしれません。本当に正しくやりたい場合は、^vip(/|$)を使用して、_vip-page.html_と一致しないようにすることをお勧めします。

127
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

これは、それが既存のファイルであるか、ディレクトリがそれに触れないことを示します。 site.com/vipにアクセスできる必要があり、書き換えルールは実行されません。

14
steve

追加するコード、および書き換えルール/条件を提供するすべての回答は役に立ちません!デフォルトのWordPressコードは既に必要なことをすべて実行しています:

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

これらの行は、「既存のファイル(-f)またはディレクトリ(-d)でない場合、WordPressに渡します。具体的または良好に関係なく、追加のルールを追加することは冗長です-すでにWordPressルール!

なぜ彼らは働いていないのですか?

vipディレクトリの.htaccessはエラーをスローしています。ディレクトリをパスワードで保護してもまったく同じことが起こります。

解決策は次のとおりです。

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

WordPress=コードの前にこれらの行を挿入し、/ err.txtを作成します。これにより、WebDAV(またはパスワードで保護されたディレクトリ)にアクセスして失敗すると、そのファイルに移動します。そして、既存のデフォルトWordPress条件(RewriteCond %{REQUEST_FILENAME} !-f)]に巻き込まれます。

10
brentonstrine

あなたはすでにあなたが無視したいディレクトリに.htaccessファイルを持っていると言いました-あなたは使用することができます

RewriteEngine off

その.htaccessでmod_rewriteの使用を停止します(そのフォルダーでmod_rewriteを使用しているかどうかわからない場合は、オフにできないので役に立たないでしょう)。

8
Jay

コードのこの部分を置き換えてみてください:

RewriteRule ^ vip /.$-[PT]

...次のように:

RewriteCond%{REQUEST_URI}!(vip)[NC]

これで問題が解決するはずです。

6
ChongFury
RewriteCond %{REQUEST_URI} !^pilot/ 

それがその方法です。

4

wordpress=を使用して同じ問題が発生し、問題が401エラーと403エラーの適切なハンドラーを持たないことにリンクしていることがわかりました。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

これらの条件は、既存のフォルダーのURLを書き換えないように既に想定されていますが、パスワードで保護されたフォルダーに対しては機能しません。私の場合、ルート.htaccessに次の2行を追加すると問題が修正されました。

ErrorDocument 401 /misc/myerror.html
ErrorDocument 403 /misc/myerror.html

もちろん、/ misc/myerror.htmlを作成する必要があります。

3
matdumsa

これは動作します...

RewriteRule ^vip - [L,NC]

しかし、それが最初のルールであることを確認してください

RewriteEngine on

つまり.

ErrorDocument 404 /page-not-found.html

RewriteEngine on

RewriteRule ^vip - [L,NC]

AddType application/x-httpd-php .html .htm

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 

etc
3
Pat

私の場合、brentonstrine(およびmatdumsaも同じ考えを持っていたことがわかります)による答えは正しいものでした...私は彼らの答えに投票したかったのですが、ここに新しいので、「評判」はないので、ここで本当の鍵だと思うことを強調するために、完全な答えを書かなければなりません。

これらの回答のいくつかは、WordPress index.phpの使用を正常に停止します...しかし、多くの場合、これを行う理由は、その中に実際のページを持つ実際のディレクトリがあることです直接表示したい

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

行はすでにそれを処理しているので、それらの解決策のほとんどは私のような場合には注意散漫です。

キーはbrentonstrine'sエラーが二次的な影響であるという洞察でした。これは、私が直接表示しようとしたディレクトリ内のパスワード保護が原因です。入れて

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

行とエラーページの作成(実際​​にerr401.htmlとerr403.htmlを作成し、より有益なエラーメッセージを作成しました)401 Authentication Requiredに表示するページが見つからなかった場合、生成された404応答を停止し、フォルダーが機能しました予想通り... Apacheログインダイアログを表示し、フォルダの内容を表示するか、失敗するとエラー401ページが表示されます。

2
carlaron