Apache .htaccess重写不适用于旧版URL

时间:2013-07-12 06:52:20

标签: apache .htaccess mod-rewrite joomla expressionengine

我正在尝试在一个现在使用ExpressionEngine作为CMS的网站上重写一些遗留的Joomla网址,但它们无法正常工作。

ExpressionEngine URL重写,即从URL中删除index.php工作正常。

这就是我所拥有的:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on

# This is the one that's not working
  RewriteRule /index.php?option=com_chronocontact&Itemid=54 /contact/  [R=301,L]

# Force www
  RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
  RewriteCond %{HTTP_HOST} (.+)$ [NC]
  RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
# Redirect index.php Requests
  RewriteCond %{THE_REQUEST} ^[^/]*/index\.php [NC]
  RewriteCond %{THE_REQUEST} ^GET
  RewriteRule ^index\.php(.+) $1 [R=301,L]
# Standard ExpressionEngine Rewrite
  RewriteCond %{REQUEST_URI} ^/
  RewriteCond %{QUERY_STRING} ^(gclid=.*)
  RewriteRule ^(.+) /index.php?/ [L,PT]
  RewriteCond $1 !\.(css|js|gif|jpe?g|png) [NC]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond  $1 !^(assets|css|images|tinymce|js|min|cms|themes|index\.php|admin\.php|favicon\.ico|index\.php|path\.php|php\.ini) [NC]
  RewriteRule ^(.+) /index.php?/ [L]

</IfModule>

有人能发现我做错了吗?

1 个答案:

答案 0 :(得分:1)

首先是你在顶部的流浪RewriteCond %{HTTPS} !=on。看起来它属于它下面的规则,如:

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
RewriteCond %{HTTP_HOST} (.+)$ [NC]
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

就您评论的规则不起作用而言,?是正则表达式的保留字符,而您的模式实际上表示p中的第二个/index.php是“可选的”。此外,您无法在重写规则中与查询字符串匹配,您需要使用重写条件并匹配%{QUERY_STRING}变量:

RewriteCond %{QUERY_STRING} ^option=com_chronocontact&Itemid=54$
RewriteRule ^(index.php)?$ /contact/? [R=301,L]

可能更符合您的需求。