【问题标题】:Does mod_rewrite only translate external requests to internal files and not vice versa?mod_rewrite 是否仅将外部请求转换为内部文件,反之亦然?
【发布时间】:2011-12-26 04:12:55
【问题描述】:

我认为这是一个非常愚蠢的问题,所以我很抱歉,因为我认为我可能完全误解了 mod_rewrite。

假设你有一个网址

www.domain.com/products/item.php?id=1234

mod_rewrite 可以将其重写为友好的 URL

wwww.domain.com/products/item/1234

(例如)

所以,如果我输入 www.domain.com/products/item/1234,这将被重写为 www.domain.com/products/item.php?id=1234 并提供该页面。很好。

但是,如果您输入 www.domain.com/products/item.php?id=1234 怎么办 - 该页面将被提供但不会重写为友好 URL。

所以我的问题是你能自动重写内部文件名吗?例如,我网站上的所有 URL 当前都是 www.domain.com/products/item.php?id=1234 格式。当用户单击此链接时,是否可以将其重写为友好 URL?还是应该始终在友好 URL 中硬编码?

如果这没有什么意义,我很抱歉!我很困惑,因为我想将不友好的 URL 重写为友好的 URL,然后提供非友好的 URL - 那不会导致无限重定向循环吗?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    Mod_rewrite 不能真正在内部重写跨域的 URL,尽管它可以 代理它们(使用 RewriteRule 中的P 选项)。假设域相同,如果在内部将友好 URL 重写回旧 URL 时使用旧 URL,您可以将客户端的浏览器重定向到友好 URL,但它们必须是同一个域。您可以通过查看实际请求 (%{THE_REQUEST}) 变量来完成此操作,而不是查看 URI,因为它们在内部被重写时会发生变化。

    当旧 URL 被使用到友好 URL 时,这会将浏览器重定向

    RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /products/item\.php
    RewriteCond %{QUERY_STRING} id=([0-9]+)
    RewriteRule ^products/item\.php$ /products/item/%1? [R=301,L]
    

    当使用友好的 URL 时,这会在内部重写:

    RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /products/item/[0-9]+
    RewriteRule ^products/item/([0-9]+) /products/item.php?id=$1  [QSA,L]
    

    【讨论】:

      【解决方案2】:

      Mod_rewrite 不会自动将“不友好”的 url 重写为友好的 url。您必须自己添加一些规则才能做到这一点。

      Mod_rewrite 也不会修改您的 html、css 或您使用的任何内容中的链接。你需要自己改变这些。

      如果用户使用友好的 url,它永远不会知道它被重写了。从用户的角度来看,Mod_rewrite 是透明的。您可以在规则中添加[R] 标志,这会使 apache 向客户端发送重定向。这样,客户端确实会看到重写的 url。

      将不友好的 URL 重定向到可怕的 url,应该只用于帮助搜索引擎(并防止链接腐烂,但这种情况比较少见)。与 Sergey 所说的不同,这可以在没有重定向循环的情况下完成。

      尝试在 SO 上四处寻找一个脚本,该脚本可以将不友好的 URL 重定向到可怕的 URL。如果找不到,请告诉我,我会提供帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 2011-10-08
        • 2013-03-15
        • 2019-09-19
        相关资源
        最近更新 更多