在Ubuntu 14.04上,使用Apache 2.4.7,我试图将子域中的所有HTTP请求重定向到单个PHP文件。
例如,请求api.exampleapp.com/auth/login
将重定向到/var/www/example-api/api.php?q=auth/login
所有代码均位于:
/var/www/example-api
在此目录中有一个api.php脚本,用于处理所有内容,以及其他不应公开的库和资源。
这是/etc/apache2/sites-available/api.exampleapp.com.conf
中的配置:
<VirtualHost *:80>
ServerAdmin admin@exampleapp.com
DocumentRoot /var/www/example-api
ServerName api.exampleapp.com
<Directory "/var/www/example-api">
Options -Indexes
RewriteEngine On
LogLevel alert rewrite:trace6
RewriteBase /
RewriteRule ^(.*)$ api.php?q=$1 [QSA,L]
</Directory>
</VirtualHost>
但是当我要求/var/www/example-api
时,我得到了500响应。
这是我在error_log
中获得的输出(无关数据,如时间被删除):
[rid#a0/initial] [perdir /var/www/example-api/] add path info postfix: /var/www/example-api/auth -> /var/www/example-api/auth/login
[rid#a0/initial] [perdir /var/www/example-api/] strip per-dir prefix: /var/www/example-api/auth/login -> auth/login
[rid#a0/initial] [perdir /var/www/example-api/] applying pattern '^(.*)$' to uri 'auth/login'
[rid#a0/initial] [perdir /var/www/example-api/] rewrite 'auth/login' -> 'api.php?q=auth/login'
[rid#a0/initial] split uri=api.php?q=auth/login -> uri=api.php, args=q=auth/login
[rid#a0/initial] [perdir /var/www/example-api/] add per-dir prefix: api.php -> /var/www/example-api/api.php
[rid#a0/initial] [perdir /var/www/example-api/] trying to replace prefix /var/www/example-api/ with /
[rid#a0/initial] strip matching prefix: /var/www/example-api/api.php -> api.php
[rid#a0/initial] add subst prefix: api.php -> /api.php
[rid#a0/initial] [perdir /var/www/example-api/] internal redirect with /api.php [INTERNAL REDIRECT]
[rid#20/initial/redir#1] [perdir /var/www/example-api/] strip per-dir prefix: /var/www/example-api/api.php -> api.php
[rid#20/initial/redir#1] [perdir /var/www/example-api/] applying pattern '^(.*)$' to uri 'api.php'
[rid#20/initial/redir#1] [perdir /var/www/example-api/] rewrite 'api.php' -> 'api.php?q=api.php'
[rid#20/initial/redir#1] split uri=api.php?q=api.php -> uri=api.php, args=q=api.php&q=auth/login
[rid#20/initial/redir#1] [perdir /var/www/example-api/] add per-dir prefix: api.php -> /var/www/example-api/api.php
[rid#20/initial/redir#1] [perdir /var/www/example-api/] initial URL equal rewritten URL: /var/www/example-api/api.php [IGNORING REWRITE]
如何在重写后阻止内部重定向?
我尝试添加RewriteCond %{REQUEST_URI} !/api.php
和其他一些变体,但没有任何效果。
答案 0 :(得分:1)
在RewriteRule
之前添加:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
不重写真实文件或文件夹
答案 1 :(得分:1)
虚拟主机上下文中的替换不会生成内部重定向。将规则从目录上下文中拉出来,使匹配和替换绝对。