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」のつづりの間違いを修正すると、動作します。
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番目のブロックの他のすべての条件と同様)、RewriteRule
はalways処理されます。
ただし、最初のコードブロックの先頭に別の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
が有効になっていない場合は、有効にする必要があります。