【问题标题】:What's going on with my mod_rewrite?我的 mod_rewrite 怎么了?
【发布时间】:2011-09-06 03:54:49
【问题描述】:

我在我的网站上设置了一个简单的 mod_rewrite 系统,它基本上可以转换

http://site.com/file -> http://site.com/file.php

这是 .htaccess 文件

Options -MultiViews
RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.site.com
RewriteRule ^(.*)$ http://site.com/$1 [R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+)/?$ http://site.com/$1.php [L]

这工作了很长时间,然后几天前我意识到,当 RewriteRule 工作时,它实际上正在更改我在状态栏中的 URL。

例如,它会将 /photos 重定向到 /photos.php,但它也会更改 URL 以显示 .php。这种情况以前从未发生过,我不确定是什么触发了这种变化。

有什么想法吗?

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    第一个重写规则需要 [L] 标志。来自[R] flag 的 mod_rewrite 文档:

    您几乎总是希望将 [R] 与 [L] 结合使用(即使用 [R,L]),因为 [R] 标志本身会将 http://thishost[:thisport] 附加到 URI,但随后将此传递给规则集中的下一条规则,这通常会导致“请求中的 URI 无效”警告。

    在这种情况下,您不会收到警告,但会在发出重定向之前而不是在第二个重定向请求进入时附加“.php”扩展名。

    另外,从第二个重写规则中的替换中删除方案和域名。完整的 URL 可能会导致隐式重定向。来自RewriteRule 的文档:

    替换 重写规则是替换原始 URL 路径的字符串 由模式匹配。 替换可以 是一个:

    [...]
    绝对网址
    如果指定了绝对 URL, mod_rewrite 检查是否 主机名匹配当前主机。如果是这样,该计划和 主机名被删除,生成的路径被视为 URL 路径。否则,将执行外部重定向 给定的 URL。强制外部重定向回 当前主机,请参阅下面的 [R] 标志。

    【讨论】:

    • 这似乎是一个可靠的解决方案,但在这里不是正确的:\ 我知道重写正在进入文件 -> file.php 行,我弄乱了要验证的行(即我将 $1.php 更改为 $1.php?foo=bar 然后 site.com/file 更改为 site.com/file.php?foo=bar)
    • 是的,第二个解决方案做到了!非常感谢,我很感激!
    • 请注意,您需要采取这两个步骤来防止真实 URL 泄漏。另外,考虑选择一个有意义的StackOverflow name,以便其他人可以使用at-replies
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2012-02-10
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多