虚拟主机配置和 mod_rewrite - 删除 PHP 扩展并添加正斜杠

虚拟主机配置和 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 错误页面。

如果我输入,就会devserver:9090/dir/index.php得到devserver:9090/dir/index/我想要的内容......

有人能帮助我制定重写规则吗?

笔记

请参阅下面的我的回答

任何能进一步阐明此答案的人都会获得 50 分。我开始了悬赏,然后找到了答案,但仍在学习,因此任何好的提示都值 +50 分。

答案1

也许有人会针对这种特殊情况得到更详细的答案,但作为更一般的建议,您可以使用RewriteLogRewriteLogLevel指令来获取有关处理哪条规则以及重写的结果是什么的详细信息。

有了这些信息,您将能够找到缺失的规则,或者至少将日志输出发送给我们以获取更多详细信息。

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

答案2

我改变了这个:

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>

相关内容