Linux
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 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文件的形式上有區別嗎
至少不是在你的問題的背景下。