2016-08-16 70 views
0

我有一个站点使用.htaccess来重写规则,但soem不起作用。Linux Mint - Apache 2.4 .htaccess rewriteRule不起作用

这是我的.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 

The requested URL /contacto was not found on this server. 

但如果我改变这样的网址www.domain.com/contacto.php它的作品。

我觉得这个从底部列表中的规则应该做的工作是不是?

# Paginas sin extension 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.+)$ $1.php [QSA] 

为什么我做错了?

这些加载我的Apache的所有模块:

​​

这是对我的domain.dev.conf文件/ etc /启用站点的Apache2 /:

<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后停止工作。

是否有应用htaccess中

形式的Apache 2和2.4之间的差异谢谢

+0

'planntilla.php'规则块的用途是什么?目前状态是,如果你请求'/ foo'并且'/ foo'存在并且请求文件名是'/.*.php',那么重写'plantilla.php' - 这是没有意义的。 –

+0

Plantilla.php就像一个模板。所有其他页面都在该文件中回显 – juanpscotto

回答

0

添加此规则采取.PHP的照顾。

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L] 
+0

Nop。这是行不通的。 – juanpscotto

0

更改此块:

# Paginas sin extension 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+)$ $1.php [QSA] 

这样:

# Paginas sin extension 
# (if exists) 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+)$ $1.php [QSA,L] 

对于增强并秉承DRY principle的目的,用下面的代码替换整个.htaccess文件相反:

RewriteEngine On 
RewriteBase/

# Ignorar archivos y directorios 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule^- [END] 

# Inicio 
RewriteRule ^inicio|home|index$ index.php [QSA,L] 

# Paginacion amigable 
RewriteRule ^(.+).(\d+)$ $1?pag=$2 [QSA,L] 

# Miniaturas 
RewriteRule ^(.*/)?tdd([A-Za-z0-9_~-]*)/(.*)$ imagen.php?param=$2&src=$1$3 [QSA,L] 

# paginas 
RewriteRule ^.*-p(\d+)$ interna.php?id=$1 [QSA,L] 

# Intranet 
RewriteRule ^.*-i(\d+)$ intranet.php?id=$1 [QSA,L] 

# Publicaciones 
RewriteRule ^.*-n(\d+)$ publicaciones_detalle.php?id=$1 [QSA,L] 

# sitemap 
RewriteRule ^sitemap.xml$ sitemap.php [QSA,L] 

# Buscador 
RewriteRule ^search$ buscar.php [QSA,L] 

# Paginas incluidas en el template 
# RewriteCond %{REQUEST_FILENAME} -f 
# RewriteCond %{REQUEST_FILENAME} ^.*\.php$ 
# RewriteRule ^(.*)$ plantilla.php?uri=$1 [QSA] 

# Paginas sin extension 
# (En caso de existencia) 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+)$ $1.php [QSA,L] 

# En caso de no existencia 
RewriteRule ^.*$ 404.php [QSA] 

在那里,我已经删除了所有对条件的重复引用,这些条件检查请求是否与现有文件或文件夹匹配 - 您只需确实需要这样做一次,然后在匹配时停止重写。为了安全起见,我建议关闭目录(通过删除第6行:RewriteCond %{REQUEST_FILENAME} -d)。

正如你所看到的,我已经评论过我在你的原始问题的评论中提到的块,因为它似乎没有特定的功能 - 你需要修复它才能使其工作。

+0

嗨,谢谢你的回复。我已经尝试过,但我得到了第一个404错误。我不明白它在Apache 2上。2它工作正常。现在我已更新到2.4并停止工作 – juanpscotto

相关问题