Apache RewriteRule - 如何防止内部重定向?

时间:2014-12-09 15:54:23

标签: apache mod-rewrite redirect httpd.conf

在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和其他一些变体,但没有任何效果。

2 个答案:

答案 0 :(得分:1)

RewriteRule之前添加:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

不重写真实文件或文件夹

答案 1 :(得分:1)

虚拟主机上下文中的替换不会生成内部重定向。将规则从目录上下文中拉出来,使匹配和替换绝对。