在我的生产服务器上,一切正常:我的.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
也许有人会针对这种特殊情况得到更详细的答案,但作为更一般的建议,您可以使用RewriteLog
和RewriteLogLevel
指令来获取有关处理哪条规则以及重写的结果是什么的详细信息。
有了这些信息,您将能够找到缺失的规则,或者至少将日志输出发送给我们以获取更多详细信息。
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>