如何在跳过某些文件夹时重写所有网址?

时间:2009-05-27 01:42:30

标签: regex mod-rewrite

我正在尝试重写我的网址以转到单个php文件:

RewriteRule ^dir/(?:(?!style|js).)*$ http://www.domain.com/single.php?uri=$1 [QSA]

然而,排除/ dir / js和/ dir / style是行不通的,因为我希望它会......

  • [redirects] domain.com/dir
  • [redirects] domain.com/dir/jason
  • [redirects] domain.com/dir/jason/pete
  • [DOES NOT REDIRECT:GOOD] domain.com/dir/js
  • [DOES NOT REDIRECT:GOOD] domain.com/dir/js / *
  • [不会重定向:不好] domain.com/dir/ js

如何更改正则表达式以满足我的需求?

3 个答案:

答案 0 :(得分:2)

尝试将style|js替换为style\b|js\b

也许RewriteCond可以像

一样使用
RewriteCond %{REQUEST_URI} !^/dir/(style|js)($|/)
RewriteRule ^/dir/(.*)$ http://www.domain.com/single.php?uri=$1 [QSA]

答案 1 :(得分:0)

编辑:

domain.com/dir/json不会重定向,因为它与正则表达式不匹配。

/ dir / json没有重定向的原因是因为js跟在dir /之后,你的正则表达式只匹配dir /后面没有 样式或者js。我认为消极的前瞻是错误的做法。我认为你真正想要的是:

RewriteCond %{REQUEST_URI} !^/dir/(js|style)(/.*)?$
RewriteRule ^dir/(.*)$ http://www.domain.com/single.php?uri=$1 [LQSA]

这基本上意味着如果URL 不是以/ js或/ style结尾(可选地在这些dirs下面还有其他路径组件),然后应用重定向规则。

答案 2 :(得分:0)

使用您的负面预测断言:

RewriteRule ^dir/(?!(?:style|js)(?:/|$))(.*) http://www.example.com/single.php?uri=$1 [QSA]

但那不太好。

或者您只是添加另一个关于$1如何开始的测试:

RewriteCond $1 !^(style|js)(/|$)
RewriteRule ^dir/(.*) http://www.example.com/single.php?uri=$1 [QSA]