【问题标题】:mod_rewrite is being ignoredmod_rewrite 被忽略
【发布时间】:2011-11-01 22:21:03
【问题描述】:

我正在尝试将“domain.com/index.php?site=food&category=beef”转换为“domain.com/food/beef”,但无论我尝试什么,它都不起作用。它总是离开原始域,我没有收到任何错误。

我认为这是我的错,我在 3 个不同的服务器(和 3 个不同的项目)上为 3 个不同的 URL 尝试了这个......看起来我不明白 mod_rewrite 的真正工作原理,尽管我阅读了关于这个的所有文档我找到的话题。我什至在 SO 上呆了好几天都没有找到任何解决方案。

在服务器上启用了 Mod_rewrite:

RewriteEngine On
RewriteRule ^  http://www.google.com [R,L]

给我“http://www.google.com/?site=food&category=beef”。看起来 mod_rewrite 无法识别查询字符串...所以我尝试了几种使用 RewriteCond %{QUERY_STRING} 的解决方案...但没有任何效果:/

希望你们能帮助我!我要疯了!

提前致谢!

【问题讨论】:

    标签: mod-rewrite query-string


    【解决方案1】:

    试试:

    RewriteEngine on
    RewriteRule ^food/beef$ index.php?site=food&category=beef [L]
    

    或更笼统地说:

    RewriteEngine on
    RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?site=$1&category=$2 [L]
    

    【讨论】:

    • 您确定在浏览器中请求的是domain.com/food/beef 而不是domain.com/index.php?site=food&category=beef 吗?
    • 对不起,我没有看到你的评论。是的,我想在我的浏览器中使用 domain.com/food/beef 而不是长 URL
    【解决方案2】:

    您是否正在尝试做这样的事情?

    RewriteRule ^([^/]+)/([^/]+)/? /index.php?site=$1&category=$2 [L]
    

    这将使得当您转到http://domain.com/food/beef 时,请求在内部被重写为“/index.php?site=food&category=beef”,并且 index.php 用于服务原始请求。浏览器的地址栏仍会显示“http://domain.com/food/beef”。

    如果您希望地址栏显示http://domain.com/index.php?site=food&category=beef,则在“[L]”中添加“R”。如果这是向后的并且您想要它,那么当有人在地址栏中输入http://domain.com/index.php?site=food&category=beef 并且请求在服务器内部被重写为“/food/beef”时,那么您需要使用 RewriteCond 解析出查询字符串:

    RewriteCond %{QUERY_STRING} ^site=([^&]+)&category=([^&]+)
    RewriteRule ^index.php /%1/%2? [L]
    

    同样的事情也适用于导致浏览器重定向的“R”,就像第一个示例一样。如果您希望地址栏更改为http://domain.com/food/beef,则括号应类似于:[L,R]。请注意,您需要在规则中的目标末尾添加一个 ? ,这样查询字符串就不会被抛出。这就是为什么在您的谷歌示例中,查询字符串被附加。

    编辑:

    看到您只是想更改浏览器地址栏中的内容,而不是内容所在的位置:

    您需要重新重写上面第二条规则已将 BACK 重写为 index.php,但没有重定向。为了防止两条规则无限循环,因为一条规则重写为另一条规则,反之亦然,您需要在某处添加一个标志,以防止上面的第二条规则一遍又一遍地重定向您。

    因此将两者结合起来,您将拥有:

    RewriteRule ^([^/]+)/([^/]+)/? /index.php?site=$1&category=$2&redirected [L]
    
    RewriteCond %{QUERY_STRING} !redirected
    RewriteCond %{QUERY_STRING} ^site=([^&]+)&category=([^&]+)
    RewriteRule ^index.php /%1/%2? [L,R=301]
    

    注意查询字符串中的redirected 参数。当有人尝试访问 url 的干净版本时,它会被插入,例如“/食物/牛肉”。在内部,它被重新路由到 index.php,但由于该规则没有“R”,因此浏览器的位置栏不会改变。

    第二条规则现在检查请求是否在查询字符串中包含 redirected 参数。如果不是,则表示有人在浏览器的位置栏中输入了 index.php 网址,因此请将浏览器重定向到干净版本。

    【讨论】:

    • 感谢您的回答!我尝试了 [L] 和 [L,R] 但浏览器栏仍然显示“domain.com/index.php?site=food&category=beef”,是的,我希望它显示“domain.com/food/牛肉”
    • 第二个不为你重定向?如果您使用第二条规则,请不要包含第一条,它们不兼容。您没有任何其他可能影响这一点的规则,是吗?
    • 否,除了第二条规则,.htaccess 是空白的。没有重定向,什么也没发生:/
    • 你有RewriteEngine On吗? (我把它省略了,认为它是多余的)
    • 是的,我的 .htaccess 看起来像这样:RewriteEngine on RewriteCond %{QUERY_STRING} ^site=([^&]+)&category=([^&]+) RewriteRule ^index.php /%1/%2? [L,R]
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多