我希望在永久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标志,但它会导致循环:(
答案 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 中不再留下_
。