【问题标题】:mod_rewrite doesn't work when accessing directory访问目录时 mod_rewrite 不起作用
【发布时间】:2012-09-28 15:52:34
【问题描述】:

我正在使用 php 开发一个网站。
我想使用 URL 的第一个目录名称作为 php 的参数。

我有以下重写规则:

RewriteRule ^([a-z][a-z])/(.*)$ xyz/$2?first-dir=$1 [L]

当我访问http://example.com/aa/b/ 时,
/xyz/b/index.php 使用参数first-dir=aa 执行。
浏览器地址栏中的网址为http://example.com/aa/b/(与输入网址相同)。

但是当我访问http://example.com/aa/b(没有拖尾/)时,
地址栏中的 URL 变为 http://example.com/xyz/b/?first-dir=aa
我不想向用户显示这个重写的 URL。

为什么会这样?
如何解决这个问题?

【问题讨论】:

    标签: php apache mod-rewrite url-rewriting


    【解决方案1】:

    这是 mod_dir 和 DirectorySlash 干扰您的 URI。当 Apache 发现您的 URI 指向一个目录但缺少尾部斜杠时,它将 301 将客户端重定向到带有尾部斜杠的相同 URI。正在应用您的规则,mod_dir 看到 /aa/b 是一个目录,因此它将浏览器重定向到 /aa/b/。您只需要检查规则中的尾部斜杠:

    RewriteRule ^([a-z][a-z])/(.*?)/?$ xyz/$2/?first-dir=$1 [L]
    

    【讨论】:

    • 谢谢!我很高兴知道DirectorySlash。您的 RewriteRule 有效。但我也想将/aa/any.php 重写为xyz/any.php?first-dir=aa。下面的代码可以做到这一点:DirectorySlash OffRewriteCond %{REQUEST_FILENAME}/index\.php -fRewriteRule ^(.*)$ $1/index.php [L]RewriteRule ^([a-z][a-z])(/.*$|$) xyz$2?first-dir=$1 [L]
    【解决方案2】:

    如果 URL 带有 /index.php 将被执行

    修复的错误: RewriteRule ^([a-z][a-z])/(.*)$ xyz/$2/index.php?first-dir=$1 [L]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多