如何将包含下划线的所有URL更改为破折号,但仅针对一个目录

时间:2013-10-19 13:22:41

标签: apache .htaccess mod-rewrite

我正在开发一个实时网站,因此我不想通过犯错来创建任何服务器错误。我需要将包含下划线的所有URL更改为破折号,但仅限于一个目录(www.domain.com/directory/),但我不想更改图像,css或js文件。

我为.htaccess所做的一切都是:

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

但我不知道如何仅针对特定情况指定此规则并排除我的图片,CSS和JavaScript文件。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

要将规则限制为某些请求,您需要使用RewriteCond。您可以在here找到文档。

要让它适用于www.domain.com/directory/,您可以将其添加到RewriteRule本身。请注意,您使用的是永久重定向,因此在您从网站的浏览器中清除缓存之前,您当前所做的任何更改都将无效。

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

要排除css和js文件,您可以使用类似的内容。这将排除(!)以.css.js\.(css|js))结尾的文件。

RewriteCond %{REQUEST_URI} !\.(css|js)$
RewriteRule ^directory/([^_]*)_([^_]*_.*) /directory/$1-$2 [N]
RewriteRule ^directory/([^_]*)_([^_]*)$ /directory/$1-$2 [L,R]

我无法测试这些规则,我鼓励您设置一个简单的localhost服务器,以便在您的实际网站上进行测试之前进行测试。如果您要在网站上测试重定向,总是使用临时重定向([R])而不是永久重定向([R=301])。浏览器会缓存永久重定向,并减少服务器上的后续请求负载,但如果您正在测试,它将记住以前的尝试。只有在所有规则都能正常工作后才能将临时重定向更改为永久重定向。