.htaccess ファイルに関連する書き換えルールを作成する方法

.htaccess ファイルに関連する書き換えルールを作成する方法

現在、次のような .htaccess ファイルがあります。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/(always|rewrite|these|dirs)/ [NC]

RewriteRule ^(.*)$ router.php [L,QSA]

これは、サイト ファイルが Web サーバーの document_root (つまりdomain.com/abc.php-> <DOCUMENT_ROOT>/abc.php) にある場合に機能します。ただし、現在の設定 (変更不可) では、これが保証されません。ドキュメント ルートと .htaccess ファイルのフォルダー (つまりdomain.com/something/abc.php-> <DOCUMENT_ROOT>/something/abc.php) の間に任意のフォルダーが存在する場合があります。唯一の問題は、2 番目が機能しなくなったことですRewriteCond。アクセスされたパスがファイルに対する相対パスであるかどうかを動的に確認する方法はありますか.htaccess

例えば:

domain.com/prefix/ファイルのディレクトリがどこにあるサイトがある場合.htaccess

NOT FORCED TO REWRITE -> domain.com/prefix/index.php
FORCED TO REWRITE -> domain.com/prefix/rewrite/index.php

domain.com/ファイルのディレクトリがどこにあるサイトがある場合.htaccess

NOT FORCED TO REWRITE -> domain.com/index.php
FORCED TO REWRITE -> domain.com/rewrite/index.php

答え1

解決策はありますが、簡単ではありません。

使用RewriteMap

私ならこうします:

作成するリライトマップファイルを参照してください詳細はこちらこれは非常に単純なテキストファイルで、まず間違ったURL'/'なし、 それから1スペース(少なくとも) そして正しい URL は次のようになります:

ok​ /folder1/
ok /folder2/
ok /folder3/

次にコード:

RewriteMap myfoldermap \
  dbm:/web/htdocs/yourwebsite.com/rewriterules/myfoldermap.map

RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)
# Now in '%1' there's the name of the folder
# Don't touch the URL but...
# ...check if it exists in the map file
RewriteRule (.*) - [QSA,E=FOLDERMAP:${myfoldermap:%1|notfound}]

# if the environment is neither empty or not found...
RewriteCond %{E:FOLDERMAP} !^(notfound|)$
# this means we found something...
# => apply the RewriteRule
RewriteRule ^(.*)$ router.php [L,QSA]

うまくいかない場合は、いつもの「2 つのヒント」を読んで、質問に書き換えログを追加してください。

2つのヒント:

ホストされた環境にいない場合 (つまり、自分のサーバーであり、ファイルだけでなく仮想ホストを変更できる場合.htaccess)、RewriteLogディレクティブを使用してみてください。これは、このような問題を追跡するのに役立ちます。

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

正規表現をチェックするための私のお気に入りのツール:

http://www.quanetic.com/Regex(preg(PCRE) ではなく ereg(POSIX) を選択することを忘れないでください!)

答え2

しますか書き直しを余儀なくされる要求されたファイルまたはディレクトリが存在する場合でも、書き換えルールが機能することを意味しますか?

はいの場合は、ファイル/ディレクトリを作成しないようにしてください。

または、2 つのルールに分けます。

RewriteRule ^/(always|rewrite|these|dirs)/ router.php [L]

書き換え条件 %{REQUEST_FILENAME} !-f

書き換え条件 %{REQUEST_FILENAME} !-d

書き換えルール ^(.*)$ router.php [L,QSA]

答え3

もし私があなたの言うことを正しく理解しているなら(特に書き直しを余儀なくされた)、RewriteBaseあなたのためです。

ところで:次のようなものは使わないドメイン.com:-)

関連情報