使用mod_write进行清理并使用Lets Encrypt

时间:2016-10-05 10:47:03

标签: apache .htaccess mod-rewrite encryption

我已经在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规则之间可能存在一些冲突,但我不知道如何让它们一起工作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

MultiViews中停用.htaccess

Options -MultiViews

MultiViews(mod_negotiation的一部分)可能会导致冲突。这与您尝试使用mod_rewrite实现的非常类似。启用MultiViews(可能在服务器配置中启用,但默认情况下已禁用),对/filename的请求将导致Apache 查找以查找文件匹配(将返回适当的mime类型)通过单步执行该目录中的文件(基本上尝试 basename 匹配的各种扩展)。

  

我已经检查了REQUEST_FILENAME返回的内容 - 它是文件名的路径(例如[REQUEST_FILENAME] => /var/www/sitename/public_html/output.php)

是的,那就是问题所在。在mod_rewrite能够做到这一点之前,MultiViews已经“固定”了URL(outputoutput.php)。