【问题标题】:How to rewrite ALL urls while skipping certain folders?如何在跳过某些文件夹时重写所有 url?
【发布时间】:2009-05-27 01:42:30
【问题描述】:

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

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

但是 /dir/js 和 /dir/style 的排除并没有像我希望的那样工作......

  • [重定向] domain.com/dir
  • [重定向] domain.com/dir/jason
  • [重定向] domain.com/dir/jason/pete
  • [不重定向:好的] domain.com/dir/js
  • [不重定向:好的] domain.com/dir/js/*
  • [DOESN'T REDIRECT: BAD] domain.com/dir/js开启

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

【问题讨论】:

  • 你可能是想写 '.*)' 而不是 '.)*'。

标签: regex mod-rewrite


【解决方案1】:

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

也许RewriteCond 可以像 in 一样使用

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

【讨论】:

  • 感谢您帮助我修复损坏的语法。您末尾的 / 应该是可选的。否则 domain.com/js 将重定向。
【解决方案2】:

已编辑:

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

/dir/json 不重定向的原因是因为 js 遵循 dir/,并且您的正则表达式仅在 dir/ 没有遵循 either 样式或 js 时匹配。我认为消极的前瞻是错误的方法。我认为您真正想要的是:

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

这基本上意味着如果 URL 不是 以 /js 或 /style 结尾(可选地在这些目录下包含更多路径组件),然后 应用重定向规则。

【讨论】:

    【解决方案3】:

    无论是你的否定前瞻断言:

    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]
    

    【讨论】:

      猜你喜欢
      • 2017-02-20
      • 2020-02-26
      • 2014-03-01
      • 2020-02-20
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多