エイリアスと書き換えを使用しようとしているが、競合するために使用できないいくつかのシナリオに対処するソリューションを次に示します。
DocumentRoot
特定のアプリケーションが/var/www/example.com/myapp
であり、次の基本的なディレクトリ構造があるとします。ここで、パブリック リクエストは 内のファイル (css ファイルなど) に対するものであるか、それpublic
以外の場合は を介してルーティングされますindex.php
。
myapp/
|- private_library/
|- private_file.php
|- private_configs/
|- private_file.php
|- public/
|- index.php
|- css/
|- styles.css
目的は 内public_webroot
のコンテンツのみを提供することですが、URL は であってはなりexample.com/myapp
ませんexample.com/myapp/public
。
以下はうまくいくように見えるかもしれません:
DocumentRoot /var/www/example.com
Alias /myapp /var/www/example.com/myapp/public
<Directory /var/www/example.com/myapp/public>
# (or in this dir's .htaccess)
RewriteEngine On
RewriteBase /public
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [QSA,PT]
</Directory>
ただし、存在しないファイルの URL を要求すると (つまり、経由する必要があるファイルindex.php
)、無限ループが発生します。
解決策の 1 つは、mod_alias を使用せず、次のようにアプリケーションのルート ディレクトリで mod_rewrite を使用することです。
DocumentRoot /var/www/example.com
<Directory /var/www/example.com/myapp>
# (or in this dir's .htaccess)
RewriteEngine On
RewriteRule (.*) public/$1 [L]
</Directory>
<Directory /var/www/example.com/myapp/public>
# (or in this dir's .htaccess)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [QSA,L]
</Directory>
そしてそれだけです!