htaccess将漂亮的网址重定向到丑陋的网址

时间:2019-07-14 20:49:45

标签: .htaccess url redirect

因此,我试图使我的URL更加美观和可共享。我有一个网站,其中包含一些用户目前可以通过example.com/?i=itemName访问的项目。但是,我希望用户能够写example.com/itemName

这意味着我必须对htaccess进行一些重定向。我想将所有URL重定向到example.com本身,但保持URL不变。为了澄清,一个例子:

用户类型为example.com/niceItem。服务器显示example.com的内容,但将URL保留为example.com/niceItem(或者,可以将URL更改为example.com/?i=niceItem,然后我可以简单地使用javascript读取URL并将其更改回到地址栏中的example.com/niceItem

到目前为止,这是我能做的最好的事情

RewriteRule ^/([^\/]+)$ /index.php?i=$1 [NC,L]

这个想法是捕获第一个之后没有斜杠的请求(例如example.com/niceItem),然后在example.com/index.php?i=niceItem处读取文件。问题是,当我加载类似example.com/niceItem的页面时,该页面显示php中i的值。它应该是niceItem,因为链接应该是example.com/?i=niceItem,但是i的值实际上是字符串index.php。不完全是我想要的。另外,我希望以下内容能正常工作

RewriteRule ^/([^\/]+)$ /?i=$1 [NC,L]

但这实际上会导致内部服务器错误。

所以,问题是,为什么这些方法不起作用,我将如何实现我试图实现的目标?


PS。实际上,我正在谈论的这个网站是example.com的子域。因此,我有sub.example.com映射到example.com/sub/,并且我需要像sub.example.com/itemNameexample.com/sub/itemName这样的URL进行美化。正如我提到的,只要其中有itemName部分,URL的格式就没什么大不了的。页面加载后,我将能够使用javascript读取URL并将其更改为所需的任何内容。

1 个答案:

答案 0 :(得分:1)

使用RewriteCond

如果 i 是唯一要传递的查询参数,则

RewriteCond "%{QUERY_STRING}" "(\?i=)(.*)$"
RewriteRule "(.*)/?$" "$1/%2"

如果您只需要提取 i ,但保留其他查询参数

RewriteCond "%{QUERY_STRING}" "(.*(?:^|&))i=([^&]*)&?(.*)&?$"
RewriteRule "(.*)/?$" "$1/%2?%1%3"

大多数每个框架都提供这种排序功能。最好不要在可能的情况下重新发明轮子。这是一个脆弱的设置,将来可能会引起您的头痛。