【问题标题】:.htaccess RewriteRule works but the URL isn't changing in the address bar?.htaccess RewriteRule 有效,但地址栏中的 URL 没有改变?
【发布时间】:2012-03-30 19:04:09
【问题描述】:

我一直在努力解决这个问题,但没有任何效果。我在 mysite.com/test.php 有一个网页,我想做一个简单的 URL 重写并将其更改为 mysite.com/testRewrite/ 执行此操作的代码应该是:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^testRewrite/$ test.php [NC,L]

无论出于何种原因,它都无法正常工作。当您转到新 URL - mysite.com/testRewrite/ 时,它可以工作。

但是,如果您输入原始 URL mysite.com/test.php,它不会将地址更改为浏览器中的新 URL。

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    mod_rewrite 不会自动强制从重写的 URL 重定向浏览器。您的规则只是说“如果有人要求/testRewrite/,请在内部将其更改为/test.php”。它无法处理对/test.php 的实际请求,这就是为什么当您尝试访问mysite.com/test.php 时,它会为您提供/test.php

    现在,mod_rewrite 的问题在于,如果您只是添加该规则:

    RewriteRule ^test.php$ /testRewrite/ [L,R=301]
    

    当它请求/test.php 时会将浏览器重定向到/testRewrite/,第一个规则将在浏览器重定向后应用,并且 URI 被重写为/test.php,然后返回 整个重写引擎 并且再次应用上述规则,从而重定向浏览器,因此第一条规则重写为/test.php,上述规则再次重定向,等等。你得到一个重定向循环。您必须添加一个条件以确保浏览器 *实际请求 /test.php 并且它不是通过重写引擎搅动的 URI:

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /test\.php [NC]
    RewriteRule ^test.php$ /testRewrite/ [L,R=301]
    

    这样,301重定向发生后,这条规则就不会再被应用了,因为实际的请求会是GET /testRewrite/ HTTP/1.1,这个条件就不会满足了。

    【讨论】:

    • 嗯...我们正在变暖,但仍然无法正常工作。我尝试使用您的代码,它肯定将浏览器中的 URL 更改为 mysite.com/testRewrite/ 但它没有显示页面。相反,我收到 404 Not Found 错误。
    • 另外,我并没有真正尝试重定向,因为无论您告诉浏览器转到 mysite.com/test.php 还是 mysite.com/testRewrite/ 它仍然是同一个页面。我对使用 mod_rewrite 的理解是,当您使用 RewriteRule 时,浏览器中的 URL 应该通过规则更改。通过这种方式,您可以隐藏动态 URL 并使它们的 SEO 更友好的版本。
    • 哦,我现在开始工作了。我在现有代码之后添加了您的代码并且它有效!谢谢乔恩·林。
    • 我对使用 mod_rewrite 的理解是,当您使用 RewriteRule 时,浏览器中的 URL 应该通过规则更改。 没有 [R]标志,它在内部重写 URI,因此浏览器的地址栏保持不变,但提供的页面是规则的目标。
    • @user1303972,除了表示感谢之外,您还应该将 ans 标记为“tick”,以便 Jon 获得声誉提升 :-)
    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多