虚拟主机configuration和mod_rewrite – 删除PHP扩展和添加正向斜杠

在我的生产服务器上,事情没有问题:在我的.htaccess文件中,PHP扩展删除和尾部的斜杠规则已经就位。

但在当地,这是行不通的(好,部分,无论如何)。 我正在运行Apache2虚拟主机的网站。 在这种情况下,我决定不使用.htaccess文件,而只是将规则添加到httpd-vhosts.conf文件中,我听说如果可能在服务器上,这是更好的方法。

虚拟主机正在工作,我用于我的网站的URL是这样的:

devserver:9090

这是我的httpd-vhosts.conf文件:

 NameVirtualHost *:9090 # for stuff other than this site <VirtualHost *:9090> ServerAdmin admin@localhost DocumentRoot "/opt/lampstack/apache2/htdocs" ServerName localhost </VirtualHost> # for site in question <VirtualHost *:9090> ServerAdmin admin@localhost DocumentRoot "/opt/lampstack/apache2/htdocs/devserver" ServerName devserver <Directory "/opt/lampstack/apache2/htdocs/devserver"> Options Indexes FollowSymLinks Includes AllowOverride None Order allow,deny Allow from all </Directory> <IfModule rewrite_module> RewriteEngine ON RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule (.*)/$ /$1.php </IfModule> # error docs ErrorDocument 404 /errors/404.php </VirtualHost> 

我面临的问题是,当我去到网站上的目录,我得到一个404错误。 举个例子,这个:

devserver:9090/page.php

devserver:9090/page/

但是去一个目录(有一个index.php ):

devserver:9090/dir/

抛出404错误页面。

如果我inputdevserver:9090/dir/index.php我得到devserver:9090/dir/index/和我想要的内容出现…

任何人都可以帮我用我的重写规则?

注意

看到我的答案在下面

50分给任何能够解释这个答案的人。 我开始了赏金,然后find我的答案,但仍然在学习,所以任何好的技巧可以值得+50。

也许有人会为这个特殊情况得到一个更详细的答案,但是作为一个更一般的build议,你可以使用RewriteLogRewriteLogLevel指令来获得关于哪个规则被处理的细节信息,以及重写的结果是什么。

有了这些信息,您就可以find缺less的规则,或者至less向我们发送日志输出以获得更多详细信息。

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog

我改变了这个:

 Options Indexes FollowSymLinks Includes 

对此:

 Options Indexes FollowSymLinks MultiViews 

现在它按预期工作…这是我去除PHP扩展的规则:

 <Directory "/opt/lampstack/apache2/htdocs/devserver"> Options Indexes FollowSymLinks Includes AllowOverride None Order allow,deny Allow from all </Directory> <IfModule rewrite_module> RewriteEngine ON # remove PHP extension RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule (.*)/$ /$1.php # add trailing slash to all URLs RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://www.example.com/$1/ [R=302,L] </IfModule>