在触发301之前将下划线替换为连字符

时间:2015-02-19 02:32:55

标签: .htaccess mod-rewrite http-status-code-301

我希望在永久301重定向之前替换URL内的所有连字符。例如:http://www.example.com/article_category/article_name 对此:http://www.example.com/article-category/article-name

我的.htaccess文件如下所示:

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_URI} ![_]
RewriteRule .? - [S=2]
RewriteRule ^/?([^_]+)_(.*)$ $1-$2 [N,L]
RewriteRule ^(.*)$ /$1 [R=301,L]

[S]标志用于防止每次重定向发生时重复上一条规则,从而导致循环。但似乎最后一条规则没有解雇,因为请求的URL保持不变,而我从想要的页面获取内容。我尝试从第三行删除L标志,但它会导致循环:(

1 个答案:

答案 0 :(得分:2)

使用环境变量可能更容易。您可以使用E重写标志设置它们。然后你可以在重写cond中检查env变量:

Options +FollowSymlinks
RewriteEngine On

RewriteRule ^(.*)_(.*)$ /$1-$2 [E=DASH:Y,DPI]
RewriteCond %{ENV:DASH} Y
RewriteRule ^([^_]+)$ /$1 [L,R=301]

因此,第一条规则会检查URI中是否有_,然后将其重写为-。因为这次重写发生了,所以我们设置了DASH环境变量。

除非设置了环境变量DASH,否则第二条规则将不会执行任何操作,这意味着至少有_被重写为-,并且正则表达式确保存在在重定向到浏览器之前,在URI 中不再留下_