我已经在Ubuntu 14.04上运行Apache的服务器上启用了加密功能,并使用auto选项将所有http请求重定向到https。这很好。
但是,我现在想使用mod_rewrite在我的网站上使用cleanurls - 我需要做的就是从所有文件名中删除.php扩展名。 (例如https://example.com/contact路由到https://example.com/contact.php)
我尝试将以下重写规则添加到.htaccess文件中:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
此配置在我的localhost设置(没有SSL)上正常工作,但在运行Lets Encrypt的实例上不起作用。
我已经测试了.htaccess正在通过添加此规则工作,该规则按预期工作(将所有www请求重定向到根域)
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
我怀疑Lets Encrypt自动设置选项和我的mod_rewrite规则之间可能存在一些冲突,但我不知道如何让它们一起工作。
非常感谢任何帮助。
答案 0 :(得分:0)
在MultiViews
中停用.htaccess
:
Options -MultiViews
MultiViews(mod_negotiation的一部分)可能会导致冲突。这与您尝试使用mod_rewrite实现的非常类似。启用MultiViews(可能在服务器配置中启用,但默认情况下已禁用),对/filename
的请求将导致Apache 查找以查找文件匹配(将返回适当的mime类型)通过单步执行该目录中的文件(基本上尝试 basename 匹配的各种扩展)。
是的,那就是问题所在。在mod_rewrite能够做到这一点之前,MultiViews已经“固定”了URL(我已经检查了REQUEST_FILENAME返回的内容 - 它是文件名的路径(例如[REQUEST_FILENAME] => /var/www/sitename/public_html/output.php)
output
到output.php
)。