У меня есть сайт, использующий .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, появляется следующая ошибка:
Not Found
Запрошенный 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 webmaster@domain.dev
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.
# 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
.
Параметры Индексы FollowSymLinks MultiViews
Попробуйте отключить MultiViews
- это только приведет к конфликту с вашей директивой mod_rewrite, чтобы внутренне переписать запрос с расширением .php
(которое фактически является тем, что MutliViews
] делает). Либо удалите это в своем VirtualHost
, либо отключите в .htaccess:
Options -MultiViews
Есть ли разница между apache 2. и 2.4 в форме применения файлов htaccess
Не в контексте вашего вопроса на минимум.