0

我尝试了大约 10 个现有 SO 问题的答案,但无济于事。使用 Salman A 在Rewrite rule that remove query string from URL and redirect 中的回答,我创建了以下 .htaccess 文件:

Options +FollowSymLinks
RewriteBase /
RewriteEngine On
RewriteCond %{QUERY_STRING} !=""
RewriteRule ^(.*) /$1? [R,L]

…目标是采用这样的网址:

http://www.example.com/index.php?c=web

……让它看起来像这样:

http://www.example.com/web

按照 Salman A 的回答后,网址看起来像:

http://www.example.com/?c=web

然后我在尝试剥离“?c =”部分时搞砸了一些东西——不幸的是,我不知道我搞砸了什么——然后我删除了 .htaccess 文件,因为我不想搞砸其他任何东西. 现在,即使没有 .htaccess 文件,一些 url - 特别是我在测试 Salman A 的答案时单击的三个 url - 仍然看起来像:

http://www.example.com/?c=web 

...即使我删除了 .htaccess 文件。三个问题:1)为什么尽管删除了 .htaccess 文件,更改仍然存在;2)这是我需要担心的事情吗?并且,3)如何修改 .htaccess 文件以使所有 url 看起来像:

http://www.example.com/web

更新:这就是我担心的http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/。如果我搞砸了 301 重定向并且新访问者访问了该网站,他们会被这个垃圾所困扰吗?有没有办法取消缓存?

4

1 回答 1

1

当您说“获取这样的 url 并使其看起来像这样”时,您的意思是让它在服务器上看起来像这样,还是在浏览器看起来像这样(两个完全不同的东西)。请参阅此答案的顶部以获得一些说明。

您实现的答案使服务器看到没有查询字符串的请求。在 URI/index.php?c=web通过 URL/文件映射管道后,mod_rewrite 生成: /index.php,删除查询字符串?c=web,最后 Web 服务器获取/index.php并提供它(无查询字符串)。当然,虽然这一切都在发生,但浏览器对所有这些 mod_rewrite 魔法一无所知,仍然显示它被告知要显示的相同 URL http://www.example.com/index.php?c=web,并且由于它从未被告知,这就是你仍然看到的 URL .

如果要更改浏览器看到的 URL,则需要从外部将浏览器重定向到新的 URL。你可以使用这样的东西:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /(index\.php)?\?c=([^&\ ]+)
RewriteRule ^ /%3? [L,R]

所以当你的浏览器请求时http://www.example.com/index.php?c=web,这条规则会匹配查询字符串,并将浏览器重定向到结果/web,从而改变浏览器URL地址栏中的URL。浏览器现在看到这个新 URL,向服务器发出一个新的请求以获取这个新 URL。您可能希望将其改回原来的样子,因为我猜您确实没有目录或文件位于/web. 所以你这样做:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?c=$1 [L]

这使得服务器/index.php?c=web可以在有人请求时看到/web

于 2012-11-29T05:52:24.343 回答