Mod rewrite无法使用PHP在htaccess中工作

Mod rewrite无法使用PHP在htaccess中工作,php,apache,.htaccess,mod-rewrite,virtualhost,Php,Apache,.htaccess,Mod Rewrite,Virtualhost,我已经从我的其他站点复制了htaccess文件(所有站点都可以工作,并且在同一台服务器上),并且只更改了需要更改的URL(即从非www重定向到www时),但它根本不起作用 例如,我将/index.php更改为/index失败,但/example.html在/example中确实有效,这让我认为这是php或htaccess与php一起工作的问题 我已经请我的几个朋友来看看,他们不明白为什么会这样 我的.htaccess文件是: RewriteEngine On RewriteCond %{HTT

我已经从我的其他站点复制了htaccess文件(所有站点都可以工作,并且在同一台服务器上),并且只更改了需要更改的URL(即从非www重定向到www时),但它根本不起作用

例如,我将
/index.php
更改为
/index
失败,但
/example.html
/example
中确实有效,这让我认为这是php或htaccess与php一起工作的问题

我已经请我的几个朋友来看看,他们不明白为什么会这样

我的.htaccess文件是:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L] 

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [NC,L] 
我的虚拟主机是:

<VirtualHost *:443>
  ServerName example.com
  ServerAlias localhost
  DocumentRoot "/var/www/example.com/public_html"
  <Directory "/var/www/example.com/public_html">
    Options +Includes +FollowSymLinks +MultiViews
    AllowOverride All
    Require all granted
  </Directory>
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

<VirtualHost *:80>
  ServerName example.com
  ServerAlias localhost
  DocumentRoot "/var/www/example.com/public_html"
  <Directory "/var/www/example.com/public_html">
    Options +Includes +FollowSymLinks +MultiViews
    AllowOverride All
    Require all granted
  </Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteCond %{SERVER_NAME} =localhost
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
  ServerName www.example.com
  ServerAlias localhost
  DocumentRoot "/var/www/example.com/public_html"
  <Directory "/var/www/example.com/public_html">
    Options +Indexes +Includes +FollowSymLinks +MultiViews
    AllowOverride All
    Require all granted
  </Directory>
SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

<VirtualHost *:80>
  ServerName www.example.com
  ServerAlias localhost
  DocumentRoot "/var/www/example.com/public_html"
  <Directory "/var/www/example.com/public_html">
    Options +Indexes +Includes +FollowSymLinks +MultiViews
    AllowOverride All
    Require all granted
  </Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.example.com [OR]
RewriteCond %{SERVER_NAME} =localhost
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
而且

root@server:~# a2enmod rewrite
Module rewrite already enabled

我以前从未在我的web服务器上遇到过任何类似的问题,我真的很困惑为什么会出现这种问题。

您没有实际说明发生了什么(错误?响应代码?等等),但是,您的配置在无扩展URL方面存在一些问题

您正在服务器配置中显式启用
MultiViews
,但是,这将与
.htaccess
中试图附加文件扩展名的mod_rewrite指令冲突<需要禁用代码>多视图。例如,
-多视图
(不是
+

但是,出于某种原因,您也在启用目录索引(
索引
)和服务器端包含(
包含
)?这是故意的吗?而且,令人困惑的是,您正在为您的www子域设置不同的选项,而不是为域顶点设置不同的选项

在vHost容器中,最好只说明所需的选项。例如:

Redirect 301 /test https://example.com/test
Options FollowSymLinks
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule !\.\w{2,4}$ %{REQUEST_URI}.php [L]
(这自然会通过不设置多视图来禁用多视图。)

.htaccess
中用于附加文件扩展名的mod_rewrite指令严格来说是不正确的。虽然它们可能适用于您的“有效”URL,但恶意用户可能会构造一个
/index/格式的URL,指向以下ServerFault问题,该问题将更详细地介绍潜在的重写循环以及由此产生的500错误响应:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule (.*) $1.html [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule !\.\w{2,4}$ %{REQUEST_URI}.php [L]