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

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 时,它会抛出这个错误:

未找到

该服务器上未找到所请求的 URL /contacto。

但如果我像这样更改 URL,www.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)

这是我的domain.dev.conf档案/etc/apache2/sites-enabled

<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文件的形式上有什么区别吗?

答案1

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

这不是导致问题的原因,但第二RewriteCond条指令可能应该检查!-d,而不是!-f。后面的规则块也是如此。

您可能还会受益于指令上的几个L( LAST) 标志,RewriteRule以停止当前处理。看起来您也不需要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做的)。在您的 .htaccess 中删除它VirtualHost或在 .htaccess 中禁用它:

Options -MultiViews

apache 2. 和 2.4 在应用 htaccess 文件的形式上有什么区别吗

至少就你的问题而言不是这样的。

相关内容