web-dev-qa-db-ja.com

.htaccessの「ホワイトリストまたはキャッチオール」に設定されたapache書き換えルール

LAMPサイトの開発版(Debian 8.5のApache 2.4)では、私のApache書き換えルールは「ホワイトリスト、キャッチオール」の概念を実装しています。具体的には、images/からの画像、css/からのスタイルシート、/jsからのjavascript、およびいくつかの名前付きファイルが静的ファイルとして直接提供され、その他すべて要求index.phpに移動します。

ルールセットは、このサイトの.confファイルの<VirtualHostブロックにあります。

 RewriteEngine on
 RewriteCond "%{REQUEST_URI}" "!^(/index\.php|/robots\.txt|/favicon\.ico)$"
 RewriteCond "%{REQUEST_URI}" "!^/images/(.*)\.(jpg|png|jpeg|gif)$"
 RewriteCond "%{REQUEST_URI}" "!^/css/(.*)\.css$"
 RewriteCond "%{REQUEST_URI}" "!^/js/(.*)\.js$"
 RewriteRule ^(.*)$ /index.php/$1 [L]

そして、これは意図したとおりに機能します。 (これは this SO Q&A に基づいており、.htaccessではなく中央の設定で動作するように適合されています。)

問題は、テストサーバー(Ubuntu 16.04)が本番環境を模倣する必要があることです。本番環境では、中央構成ではなく.htaccessを使用する必要があり、このルールセットは.htaccessでは機能しません。したがって、問題は.htaccessで同じ効果を得る方法です。

Apache2.confのAllowOverride allブロックで<Directory /srv/www/site1>をオンにし、.htaccessファイル(このサイトのDocumentRoot値)に/srv/www/site1ファイルを配置しました。 this Apache doc に基づいて、条件のパスとファイル名から最初のスラッシュを削除しました。この問題をデバッグするには、VH定義にLogLevel info rewrite:trace8を追加します。

現在の.htaccessは次のとおりです。

 Options -Indexes +FollowSymLinks
 AddDefaultCharset UTF-8
 RewriteEngine on
 # RewriteBase "/"
 # AccepthPathInfo on
 RewriteCond "%{REQUEST_URI}" "!^(robots\.txt|favicon\.ico|css\/styles\.css)$"
 RewriteCond "%{REQUEST_URI}" "!^index\.php"
 RewriteCond "%{REQUEST_URI}" "!^css/(.*)\.css$"
 RewriteCond "%{REQUEST_URI}" "!^images/(.*)\.(jpg|png|jpeg|gif)$"
 RewriteCond "%{REQUEST_URI}" "!^js/(.*)\.js$"
 RewriteRule ^(.*)$ /index.php/$1 [L]

また、http 500を取得します。Apacheエラーログは、リダイレクト制限に達するまでルールをループし、「index.php/index.php/index.php/...」などの不正なパスを作成していることを示しています。

URLの書き換えに関する非常に多くのページを見つけましたが、これに役立つページはほとんどありません。

編集:w3dkによって解決-ありがとう!以下のソリューションを適用し、「AcceptPathInfo」のつづりの間違いを修正すると、動作します。

2
stephen_789
RewriteEngine on
RewriteCond "%{REQUEST_URI}" "!^(/index\.php|/robots\.txt|/favicon\.ico)$"
RewriteCond "%{REQUEST_URI}" "!^/images/(.*)\.(jpg|png|jpeg|gif)$"
RewriteCond "%{REQUEST_URI}" "!^/css/(.*)\.css$"
RewriteCond "%{REQUEST_URI}" "!^/js/(.*)\.js$"
RewriteRule ^(.*)$ /index.php/$1 [L]

最初のディレクティブの形式は、.htaccessでも同様です。ただし、.htaccessでは、index.phpへの書き換え後の書き換えループを防ぐために追加の条件が必要です。

RewriteCond "%{REQUEST_URI}" "!^index\.php"

2番目のコードブロックでこれを実行しようとしたことがわかりますが、REQUEST_URIの値は、サーバー構成で直接コーディングする場合でも.htaccessでコーディングする場合でも同じです。スラッシュ。したがって、上記の否定条件は常に真であり(2番目のブロックの他のすべての条件と同様)、RewriteRulealways処理されます。

ただし、最初のコードブロックの先頭に別のRewriteRuleを追加できます。

RewriteRule ^index\.php - [L]

したがって、すべてをまとめると、これは次のようになります。

RewriteEngine on

RewriteRule ^index\.php - [L]

RewriteCond "%{REQUEST_URI}" "!^(/index\.php|/robots\.txt|/favicon\.ico)$"
RewriteCond "%{REQUEST_URI}" "!^/images/(.*)\.(jpg|png|jpeg|gif)$"
RewriteCond "%{REQUEST_URI}" "!^/css/(.*)\.css$"
RewriteCond "%{REQUEST_URI}" "!^/js/(.*)\.js$"
RewriteRule ^(.*)$ /index.php/$1 [L]
# AccepthPathInfo on

AcceptPathInfoが有効になっていない場合は、有効にする必要があります。

1
MrWhite