循环mod_rewrite并将下划线转换为破折号

时间:2013-02-01 00:42:35

标签: apache .htaccess mod-rewrite

我们目前在.htaccess文件中使用以下规则:

# Convert URLs with underscores into hyphens (excluding any image files)
# Keep scanning the URL as long as there are two hyphens
RewriteRule       ^(/?.*[^/]*?)-([^/]*?-[^/]*)$ $1_$2 [N,QSA] 

# Replace last hyphen and do a permanent redirect (ending the rewriting operation)
RewriteRule       ^(/?.*[^/]*?)-([^/-]*)$       $1_$2 [L,QSA] 

但是,我们的网站托管服务商正在通过以下投诉关闭我们的网站:

  

在跟踪此问题时,我们可以发现在其中重写N的FLAG   第一条规则就是循环。这创造了运行数小时的过程   作为无限循环和咀嚼服务器的资源,如   产生每个使用几百MB内存的进程   过程

你们这些mod_rewrite专家有没有更好的方法来做到这一点?

我们只是尝试使用破折号替换我们文件中的所有下划线。遗憾的是,我们使用的软件无法在文件名中生成带破折号的文件。

非常感谢!

谢谢,道格

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/([^_]*)?_?([^_]*)?_?([^_]*)?_?([^_]*)?_?([^_]*)?_?([^_]*)?/? [NC]
# Replace underscores (_) with hyphens (-)
RewriteRule .*     %1-%2-%3-%4-%5-%6       [L,C]
# Remove unused trailing hyphens
RewriteRule ^(.*)\.([\w]+)(?:[\-]*)?$   $1.$2 [R=301,L]

在文件名中用短划线_替换最多5个下划线-。例子:

http://example.com/name1.ext

http://example.com/name1_name2_name3_name4_name5_name6.ext

不修改文件扩展名。

网址结构必须为http://domain/filename

重定向是永久性的。对于静默映射,请从[R = 301,L]中删除R=301