我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!)进行搜索,但找不到太多有关此的信息。
重写规则的目标(第二个参数)可以是文件路径或URL路径。当不清楚它是什么时,mod_rewrite会猜测,看起来好像是在猜测这是一个文件路径。您可以尝试一些方法:
/
/web/
对于1和2:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ /web/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/web/
RewriteRule ^(.*)$ /web/$1 [QSA,L]
</IfModule>
可能3:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ /web/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/web%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/web%{REQUEST_URI} -d
RewriteRule ^(.*)$ /web/$1 [QSA,L]
</IfModule>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句