ExpressionEngine mod_rewrite规则将带有下划线的URL重定向到破折号

时间:2011-11-23 17:38:59

标签: regex apache .htaccess expressionengine

我正在使用ExpressionEngine作为我的CMS,并希望从我网站的网址中删除下划线并将其替换为破折号。

例如,我有一个格式如下的网址:

http://example.com/index.php/menu/friday-lunch

要从网址中删除index.php,我使用以下mod_rewrite规则:

RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

哪个有效,因为我只需输入:http://example.com/menu/friday-lunch

在旧网站上,我使用下划线而不是页面URI的连字符,所以我编写了一个mod_rewrite规则来重定向带下划线的URI以使用短划线。

因此friday_lunch使用以下RewriteRule变为friday-lunch

RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]

此规则运行良好,但301重定向到example.com/index.php/menu/friday-lunch而不是example.com/menu/friday-lunch - 请注意index.php的添加。

这是我目前正在使用的整个.htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Removes index.php
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
    RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
    RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301] 
</IfModule>

如何将带有下划线的所有网址重定向到带有破折号的等效网址?

奖励:更糟糕的是,导致/system的网址不得使用连字符重写,例如:example.com/system/login_in/

2 个答案:

答案 0 :(得分:2)

这是一套完整的RewriteRules,可以满足您的需求:

<IfModule mod_rewrite.c>
    # Enable Apache's RewriteEngine
    RewriteEngine On

    # Ignore Matching Directories
    RewriteRule ^(images|themes|system) - [L,NC]

    # Replace Underscores with Dashes
    RewriteRule ^([^_]*)_([^_]*)_(.*)$ /$1-$2-$3 [R=301,L]
    RewriteRule ^([^_]*)_(.*)$ /$1-$2 [R=301,L]

    # Remove index.php from ExpressionEngine URLs
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

要让mod_rewrite规则忽略ExpressionEngine system文件夹而不用短划线_替换下划线-,请使用以下命令:

RewriteRule ^(images|themes|system) - [L,NC]

将RewriteRule解析为普通英语:

  • -标志指示Apache 不执行任何操作不重写 URI
  • L标志意味着这应该是最后一条规则;忽略一切
  • NC标志表示无案例(因此“系统”或“系统”也匹配)

此“忽略”规则特别重要,您可能需要添加其他目录以排除,具体取决于您的目录结构。

否则,您最终可能会使用下划线保存的图像和其他文件会被短划线替换。


注意:如果您的网址包含三个以上的下划线,则您需要为要替换的每个Word Separator for URL Titles在现有网址上方添加另一个RewriteRule:

RewriteRule ^([^_]*)_([^_]*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4-$5 [R=301,L]
RewriteRule ^([^_]*)_([^_]*)_(.*)_(.*)$ /$1-$2-$3-$4 [R=301,L]

答案 1 :(得分:0)

您在替换字符串中包含了“index.php”。

RewriteRule ^(.*)$ index.php/$1 -> RewriteRule ^(.*)$ $1