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, появляется следующая ошибка:

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.

1
задан 21 August 2016 в 03:30
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 .

 Параметры Индексы FollowSymLinks MultiViews
 

Попробуйте отключить MultiViews - это только приведет к конфликту с вашей директивой mod_rewrite, чтобы внутренне переписать запрос с расширением .php (которое фактически является тем, что MutliViews ] делает). Либо удалите это в своем VirtualHost , либо отключите в .htaccess:

Options -MultiViews

Есть ли разница между apache 2. и 2.4 в форме применения файлов htaccess

Не в контексте вашего вопроса на минимум.

1
ответ дан 3 December 2019 в 23:42

Теги

Похожие вопросы