这是一个解决方案,可以解决您尝试使用别名和重写但由于它们冲突而无法使用的某些情况。
假设您DocumentRoot
的特定应用程序是/var/www/example.com/myapp
,并且您具有以下基本目录结构,其中公共请求要么针对文件public
(例如,css 文件),要么通过index.php
.
myapp/
|- private_library/
|- private_file.php
|- private_configs/
|- private_file.php
|- public/
|- index.php
|- css/
|- styles.css
目标是仅在内部提供内容,但是 URL不public_webroot
应该是.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
),这将导致无限循环。
一种解决方案是不使用 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>
就这样!