私は大量の仮想ホスティングvhost_alias
を行うために使用しており、フロントコントローラーの管理に使用しているサイトがいくつかあります。mod_rewrite
これは特定の Symfony の問題ではないと思いますが、私は Symfony を使用しています。
現在、書き換えルールに一致するほとんどのリクエストは、HTTP エラー 500 を引き起こす無限のリダイレクト ループに陥ります。
ログファイルを確認したところ、次のことがわかりました。
(3) [perdir /home/user/www/mysite/] strip per-dir prefix: /home/user/www/mysite/app_dev.php -> app_dev.php
(3) [perdir /home/user/www/mysite/] applying pattern '^$' to uri 'app_dev.php'
(3) [perdir /home/user/www/mysite/] strip per-dir prefix: /home/user/www/mysite/app_dev.php -> app_dev.php
(3) [perdir /home/user/www/mysite/] applying pattern '^(.*)$' to uri 'app_dev.php'
(2) [perdir /home/user/www/mysite/] rewrite 'app_dev.php' -> 'web/app_dev.php'
(3) [perdir /home/user/www/mysite/] add per-dir prefix: web/app_dev.php -> /home/user/www/mysite/web/app_dev.php
(1) [perdir /home/user/www/mysite/] internal redirect with /home/user/www/mysite/web/app_dev.php [INTERNAL REDIRECT]
(3) [perdir /home/user/www/mysite/] add path info postfix: /home/user/www/mysite/home -> /home/user/www/mysite/home/user/www/mysite/web/app_dev.php
(3) [perdir /home/user/www/mysite/] strip per-dir prefix: /home/user/www/mysite/home/user/www/mysite/web/app_dev.php -> home/user/www/mysite/web/app_dev.php
(3) [perdir /home/user/www/mysite/] applying pattern '^$' to uri 'home/user/www/mysite/web/app_dev.php'
ご覧のとおり、内部リダイレクト行の後、絶対パスは一致する URI の一部になります。この URI はもちろんどのファイルにも一致せず、完全に新しい URI として再度処理されます。これにより、新しい絶対パスが追加されます。 URI。このプロセスは、構成された制限に達するまで繰り返されます。
仮想ホスト構成なしでこれを試してみましたが (正常に動作します)、内部リダイレクトの前に新しい行があることに気付きました:
(2) [perdir /home/user/www/mysite/] strip document_root prefix: /home/user/www/mysite/web/app_dev.php -> /web/app_dev.php
(1) [perdir /home/user/www/mysite/] internal redirect with /web/app_dev.php [INTERNAL REDIRECT]
このリダイレクト後、実際のファイルが一致し、問題はありません。
document_root
通常の構成だけでなく、仮想構成でも仮想を削除する必要はありませんか?
仮想ドキュメント ルートが内部リダイレクトの URI の一部と見なされる理由がわかりません。これは明らかに間違っているようです。
いくつかの構成オプションがありませんか?
これが私の.htaccess
ファイルです:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ web/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ web/$1 [QSA,L]
</IfModule>
これが私のApache設定ファイルです:
# get the server name from the Host: header
UseCanonicalName Off
<VirtualHost *:80>
LogLevel debug
RewriteLogLevel 3
RewriteLog "/var/log/apache2/rewrite.log"
VirtualDocumentRoot /home/user/www/%1
#DocumentRoot /home/user/www
#RewriteEngine on
#RewriteCond %{HTTP_HOST} ^(.*)\.dev$ [NC]
#RewriteRule ^/(.+)$ /home/user/www/%1/$1 [QSA,L]
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/user/www>
Options Indexes FollowSymLinks -MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
宣言の下VirtualDocumentRoot
には、コメント化された書き換え規則がいくつかあります。
これは を書き換えルールに置き換える試みでしたVirtualDocumentRoot
が、同様の問題がありました: ストライプ化された document_root は/home/user/www
であり、URL の一部としてホスト名が残っているため、同じ再帰的な問題が発生します。
だから、誰かが でmod_vhost_alias
仕事をしたことがあるかどうか知りたいですmod_rewrite
。私は本当にどこでも検索しようとしましたが (Google でさえも!)、これに関する多くの情報を見つけることができませんでした。