Linux

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

  • August 21, 2016

我有一個使用 .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 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指令來控制。

Options Indexes FollowSymLinks MultiViews

嘗試禁用MultiViews- 這只會與您的 mod_rewrite 指令衝突,以在內部使用.php副檔名重寫請求(這實際上是這樣MutliViews做的)。在您的中刪除VirtualHost它或在 .htaccess 中禁用它:

Options -MultiViews

apache 2.和2.4在應用htaccess文件的形式上有區別嗎

至少不是在你的問題的背景下。

引用自:https://serverfault.com/questions/798126