Apache2的mod_rewrite失败的不存在的子目录

甚至更短版本的.htaccess文件(Last RewriteCond不存在)用于在我的共享虚拟主机上完美工作,但我已经转移到与Ubuntu 12的VPS与它的股票Apache2,但它根本不会工作(甚至与我的变化),我不明白为什么。 我可以访问example.com或example.com/news,但不能访问example.com/article/4

我把mod_rewrite块从.htaccess到vhostconfiguration,反之亦然,但似乎没有工作。 我猜它实际上试图去到文章的子目录或东西(这不存在如此404),但我不知道如何阻止它做到这一点。

我正在使用Apache版本2.2.22

我的虚拟主机文件

<VirtualHost 127.0.0.1:80> DocumentRoot /home/example/www/example.com RewriteLogLevel 3 RewriteLog /home/example/www/example.rewrite.log <Directory "/home/example/www/example.com"> AllowOverride All Options -ExecCGI +FollowSymLinks -Indexes -MultiViews Order deny,allow allow from all <IfModule mod_rewrite.c> RewriteEngine On RewriteOptions inherit </IfModule> </Directory> AccessFileName .htaccess ServerSignature Off ServerName example.com ErrorLog /home/example/www/example.log LogLevel warn </VirtualHost> 

我的.htaccess文件

 ErrorDocument 404 /index.php?404 ErrorDocument 403 /index.php?403 ErrorDocument 500 /index.php?500 Options -ExecCGI +FollowSymLinks -Indexes -MultiViews <IfModule mod_rewrite.c> RewriteEngine On RewriteOptions inherit RewriteBase / RewriteCond %{REQUEST_FILENAME} !-s RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/index\.php RewriteRule ^(.*)$ /index.php?$1 [L] </IfModule> 

当访问example.com/article/4时重写redirect循环日志

 [example.com/sid#8475130][rid#867d470/initial] (3) [perdir /home/example/www/example.com/] add path info postfix: /home/example/www/example.com/article -> /home/example/www/example.com/article/4 [example.com/sid#8475130][rid#867d470/initial] (3) [perdir /home/example/www/example.com/] strip per-dir prefix: /home/example/www/example.com/article/4 -> article/4 [example.com/sid#8475130][rid#867d470/initial] (3) [perdir /home/example/www/example.com/] applying pattern '^(.*)$' to uri 'article/4' [example.com/sid#8475130][rid#867d470/initial] (2) [perdir /home/example/www/example.com/] rewrite 'article/4' -> '/index.php?article/4' [example.com/sid#8475130][rid#867d470/initial] (3) split uri=/index.php?article/4 -> uri=/index.php, args=article/4 [example.com/sid#8475130][rid#867d470/initial] (2) [perdir /home/example/www/example.com/] trying to replace prefix /home/example/www/example.com/ with / [example.com/sid#8475130][rid#867d470/initial] (1) [perdir /home/example/www/example.com/] internal redirect with /index.php [INTERNAL REDIRECT] [example.com/sid#8475130][rid#b6ce9950/initial/redir#1] (3) [perdir /home/example/www/example.com/] strip per-dir prefix: /home/example/www/example.com/index.php -> index.php [example.com/sid#8475130][rid#b6ce9950/initial/redir#1] (3) [perdir /home/example/www/example.com/] applying pattern '^(.*)$' to uri 'index.php' [example.com/sid#8475130][rid#b6ce9950/initial/redir#1] (1) [perdir /home/example/www/example.com/] pass through /home/example/www/example.com/index.php [example.com/sid#8475130][rid#b6cd7058/initial] (3) [perdir /home/example/www/example.com/] strip per-dir prefix: /home/example/www/example.com/404 -> 404 [example.com/sid#8475130][rid#b6cd7058/initial] (3) [perdir /home/example/www/example.com/] applying pattern '^(.*)$' to uri '404' [example.com/sid#8475130][rid#b6cd7058/initial] (2) [perdir /home/example/www/example.com/] rewrite '404' -> '/index.php?404' [example.com/sid#8475130][rid#b6cd7058/initial] (3) split uri=/index.php?404 -> uri=/index.php, args=404 [example.com/sid#8475130][rid#b6cd7058/initial] (2) [perdir /home/example/www/example.com/] trying to replace prefix /home/example/www/example.com/ with / [example.com/sid#8475130][rid#b6cd7058/initial] (1) [perdir /home/example/www/example.com/] internal redirect with /index.php [INTERNAL REDIRECT] [example.com/sid#8475130][rid#b6ce5440/initial/redir#1] (3) [perdir /home/example/www/example.com/] strip per-dir prefix: /home/example/www/example.com/index.php -> index.php [example.com/sid#8475130][rid#b6ce5440/initial/redir#1] (3) [perdir /home/example/www/example.com/] applying pattern '^(.*)$' to uri 'index.php' [example.com/sid#8475130][rid#b6ce5440/initial/redir#1] (1) [perdir /home/example/www/example.com/] pass through /home/example/www/example.com/index.php 

汇总访问日志

 "GET /article/4 HTTP/1.1" 302 4095 "-" "GET /404 HTTP/1.1" 200 2405 "-" 

你原来的重写规则看起来很简单:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteOptions inherit RewriteBase / RewriteCond %{REQUEST_FILENAME} !-s RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/index\.php RewriteRule ^(.*)$ /index.php?$1 [L] </IfModule> 

你有没有尝试过使用简单的SEO / SEF .htaccess如与WordPress捆绑在一起的? 在这里,但是我添加了原始设置中的RewriteOptions inherit规则:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteOptions inherit RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> 

日志表明你的规则是完美的。

index.php脚本是使用参数?article/4执行的,脚本使用302redirect到/404来进行响应。 任何重写规则中都没有[R]选项,因此它必须是发出redirect的脚本。

浏览器对/404进行了跟进请求,并生成了200响应。


我怀疑你有三个问题。 首先,当脚本无法find内容时,您的脚本会对URL /404发出302响应。 它应该发出一个404响应。

第二个是你的/404脚本发出200响应。 它应该发出一个404响应。

第三个是你的index.php脚本不知道如何处理这个参数?article/4 。 我不知道你的脚本是如何工作的,但是我build议在脚本中debugging一下可能会解决你的问题。 使用echo()通过脚本或类似file_put_contents("/var/log/apache2/example.com.debug.log", time()." ".$variable."\n", FILE_APPEND)各个阶段的某些file_put_contents("/var/log/apache2/example.com.debug.log", time()." ".$variable."\n", FILE_APPEND)