我有一个网站使用.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它抛出我这个错误:
未find
- 分派器上的Apache重写规则
- Ubuntu 14服务器 – 在下载文件之前设置用户名密码提示
- url被附加到redirect链接htaccess
- htaccess在特定的域redirect到特定的path
- redirect选项在.htaccess文件中删除后redirect
在此服务器上找不到请求的URL / contacto。
但是,如果我改变这样的urlwww.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)
这是/etc/apache2/sites-enabled上的我的domain.dev.conf文件:
<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文件的forms有区别。
# Paginas sin extension RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ $1.php [QSA]
不是你的问题的原因,但第二个RewriteCond指令应该检查!-d ,而不是!-f 。 接下来的规则块也是如此。
您也可能从RewriteRule指令中的几个L ( LAST )标志中受益,以停止当前的一轮处理。 它也不像你需要所有的指令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文件的forms有区别
至less在你的问题的背景下。