我正在使用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/
。
答案 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