Linux Mint – Apache 2.4 .htaccess rewriteRule不起作用

我有一个网站使用.htaccess重写规则,但有些不起作用。

这是我的.htaccess文件:

RewriteEngine On RewriteBase / # Inicio RewriteRule ^inicio|home|index$ index.php [QSA,L] # Paginacion amigable RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)\.([0-9]+)$ $1?pag=$2 [QSA,L] # Miniaturas RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*\/)?tdd([A-Za-z0-9_~-]*)\/(.*)$ imagen.php?param=$2&src=$1$3 [QSA,L] #paginas RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*-p([0-9]+)$ interna.php?id=$1 [QSA] #Intranet RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*-i([0-9]+)$ intranet.php?id=$1 [QSA] #publicaciones RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*-n([0-9]+)$ publicaciones_detalle.php?id=$1 [QSA] # Paginas sin extension RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ $1.php [QSA] # sitemap RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f RewriteRule sitemap.xml sitemap.php [QSA] # Buscador RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^search$ buscar.php [QSA] # En caso de no existencia RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ 404.php [QSA] # Paginas incluidas en el template RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{REQUEST_FILENAME} ^.*\.php$ RewriteRule ^(.*)$ plantilla.php?uri=$1 [QSA] 

但我有一个错误,例如,当我访问www.domain.com/contacto它抛出我这个错误:

未find

在此服务器上找不到请求的URL / contacto。

但是,如果我改变这样的urlwww.domain.com/contacto.php它的作品。

我认为从底部的这个规则应该做的工作,不是吗?

 # Paginas sin extension RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ $1.php [QSA] 

我为什么做错了?

这些都是我的Apache加载的模块:

 Loaded Modules: core_module (static) so_module (static) watchdog_module (static) http_module (static) log_config_module (static) logio_module (static) version_module (static) unixd_module (static) access_compat_module (shared) alias_module (shared) auth_basic_module (shared) authn_core_module (shared) authn_file_module (shared) authz_core_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) filter_module (shared) mime_module (shared) mpm_prefork_module (shared) negotiation_module (shared) php7_module (shared) rewrite_module (shared) setenvif_module (shared) status_module (shared) 

这是/etc/apache2/sites-enabled上的我的domain.dev.conf文件:

 <VirtualHost *:80> ServerAdmin [email protected] DocumentRoot /var/www/html/domain/ ServerAlias www.domain.dev ServerName domain.dev ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /var/www/html/domain> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all RewriteEngine On </Directory> </VirtualHost> 

它在Apache 2.2上工作正常,但升级到2.4后停止工作。

apache 2.和2.4应用htaccess文件的forms有区别。

 # Paginas sin extension RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ $1.php [QSA] 

不是你的问题的原因,但第二个RewriteCond指令应该检查!-d ,而不是!-f 。 接下来的规则块也是如此。

您也可能从RewriteRule指令中的几个LLAST )标志中受益,以停止当前的一轮处理。 它也不像你需要所有的指令QSA标志?

 # En caso de no existencia RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ 404.php [QSA] 

这应该显示最后。 下面的规则块永远不会执行。 但是,这应该由ErrorDocument指令来控制。

 Options Indexes FollowSymLinks MultiViews 

尝试禁用MultiViews – 这只会与你的mod_rewrite指令发生冲突,从而在内部用.php扩展名重写请求(这实际上是MutliViews所做的)。 要么删除你的VirtualHost或禁用它在.htaccess:

 Options -MultiViews 

apache 2.和2.4应用htaccess文件的forms有区别

至less在你的问题的背景下。