web-dev-qa-db-ja.com

.htaccess RewriteRuleが機能しない

私はこれがうまく機能するWAMPを使用するWindows環境を持っています。 Ubuntuデスクトップ開発環境をセットアップしていますが、この特定のmod_rewriteが機能していません。

かなり基本的なことですが、
_example.local/files/a-real-file.pdf_ Apacheから_404 not found_を取得しました。私が行くなら
_example.local/files.php/a-real-file.pdf_ファイルは期待どおりに表示されます。私が行くなら
_example.local/files.php/non-existing-file.who.cares_ _files.php_ロジックから期待どおりにvar_dump($thelink)を取得します。

webルートの_.htaccess_

_RewriteEngine On
RewriteRule ^files/(.*)$ files.php/$1
_

私のApache仮想ホスト設定

_<VirtualHost *:80>
    ServerName reqapp.localhost
    DocumentRoot /var/www/html/aaApp/public_html
    <Directory /var/www/html/aaApp/public_html/>
        Options +Indexes +Includes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
_

そして良い尺度として、「localhost」conf

_<VirtualHost *:80>
    ServerName localhost
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${Apache_LOG_DIR}/error.log
    CustomLog ${Apache_LOG_DIR}/access.log combined
</VirtualHost>
_

_Apache2.conf_の「適用可能な」部分と同様に

_<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
_

phpinfo()に従って_mod_rewrite_がロードされます。 _.htaccess_ファイルに構文エラーを作成すると、サイトがクラッシュします。

他にどこを見ればいいのかわからない。このディレクトリに影響を与えるはずの「{mods | conf | sites}対応」ファイル内の他の_.conf_ファイルを細かくすることはできません。

私もJoomlaインスタンスを実行していて、SEFはそれで正常に動作していることを言及する価値があるかもしれません。

2
Chad
Options +Indexes +Includes +FollowSymLinks +MultiViews

MultiViewsを無効にする必要があります(または単に有効にしない)。例えば:

Options +Indexes +Includes +FollowSymLinks -MultiViews

または、サーバーで有効になっていない場合は、Optionsディレクティブから完全に削除します。

MultiViewsを有効にすると、mod_negotiationはfiles.phpの内部サブリクエストをトリガーします(リクエストの成功に必要な追加のパス名情報なしで)beforemod_rewriteがリクエストをテストします。したがって、RewriteRulepatternは一致せず、書き換えは発生しません。

PDATE: MultiViewsはmod_negotiation(コンテンツネゴシエーション)の一部です。あなたの場合の問題は、/files/...(有効なディレクトリ-ドキュメントルート)をリクエストしていて、そのベース名を持つファイルがそのディレクトリに存在することです。 /bar/...(おそらく存在しない)または/another.php/...への書き換えを要求した場合、この問題は発生していません。

/files/...をリクエストすると、MultiViewsは適切なリソース(files.*-基本的にさまざまなファイル拡張子を試す)をApachesearchingして、期待されるMIMEで応答するまで結果を表示します。 -タイプが見つかりました。 「問題」は、これがリクエストの非常に早い段階で発生するため、mod_rewriteと競合することが多いことです。

これは、拡張子のないURLを有効にする簡単な方法です(URLの書き換えは必要ありません)。ただし、もう少し複雑なことを行う必要があるとすぐに、mod_rewriteと競合する可能性があります。これは一般的な問題です。 MultiViewsは、Apacheではデフォルトで有効になっていません(ただし、一部のsharedホストでは有効になっています)。

3
MrWhite