htaccess重写规则以无限循环结束

时间:2014-08-06 16:53:19

标签: regex apache .htaccess mod-rewrite url-rewriting

我想永久重定向

www.example.com/event/title-goes-herewww.example.com/event/jazz/title-goes-here

在我的htaccess文件中使用正则表达式。

我目前有:

RewriteEngine on
RewriteRule ^event/(.*)$ http://www.example.com/event/jazz/$1 [R=301,L]

但这导致无限循环(它转到example.com/event/jazz/jazz/jazz/jazz等),因为/ event / part是相同的。

如何使用重写规则进行重写,同时考虑到人们可以转到example.com/event/title-goes-hereexample.com/event/title-goes-here/(所以使用尾部斜线),同时仍然正确地进行重定向。

EDIT / UPDATE

根据anubhava的回答,我的完整.htaccess文件现在看起来像这样(忘了提及那里也是对index.php的重写):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]
RewriteRule ^event/([^/]+)/?$ /event/jazz/$1 [R=301,L,NC,NE]

也忘了提及我使用CodeIgniter而在我的routing.php中有下面列出的路由选项(不知道这是否重要)。认为这纯粹是一个.htaccess的事情,但是当我想到路由文件时,我认为这可能会因重写而混乱?

$route['event/jazz/(:any)'] = 'event/view/$1';
$route['(:any)'] = 'pages/view/$1';

1 个答案:

答案 0 :(得分:0)

是的,它会循环,因为源和目标URI都匹配你的正则表达式模式。

使用此规则修复它:

RewriteEngine on

RewriteRule ^event/([^/]+)/?$ /event/jazz/$1 [R=301,L,NC,NE]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php/$0 [PT,L]