使用.htaccess清理GET URL

时间:2016-05-02 06:13:58

标签: php apache .htaccess

在发表任何评论之前,我知道有很多关于这个主题的帖子,但是它们似乎都没有解决我的问题,这就是我开始这个帖子的原因。

所以,我的网站中有一个名为project.php的网页,用于GET查询,如下所示:project.php?id=12我想要一个.htaccess文件,将给定的网址转换为localhost/MyWeb/project/id/12/。我确实关注过每个关于该主题的帖子,但它们似乎都没有效果。

此外,我希望我的所有.php.html文件只显示其名称,即localhost/MyWeb/index.php/变为localhost/MyWeb/index/和{{1} }变成localhost/MyWeb/sub1/sub2.php

修改

我之所以没有首先加入我的作品是因为我认为这不会有任何帮助。但这是:

localhost/MyWeb/sub1/sub2/

1 个答案:

答案 0 :(得分:2)

首先,您在子目录(MyWeb)之外操作,这意味着您需要设置RewriteBase。此外,您需要确保将.htaccess文件放在该子目录中,而不是放在localhost文档根目录中。

因此,在RewriteEngine on下方,插入以下行:

RewriteBase /MyWeb/

接下来,您声明要将project.php?id={id}转换为project/id/{id},但您的代码会忽略/id/段。我还注意到你有两个规则,第二个规则与你的问题相矛盾,所以我只会向你展示你需要为第一条规则做出的改变,直到你澄清第二条规则是什么为止。

要使项目URI有效,请将第一个规则更改为:

RewriteRule ^project/id/([0-9]+)/?$ project.php?id=$1 [QSA,L]

这将匹配您想要的URI,并带有可选的尾部斜杠。我还添加了QSA标志,它将任何额外的查询字符串参数附加到重新连接的URI,以及L标志,如果规则匹配则停止处理。

接下来,要从URI中省略.php.html,请将最后三行更改为以下内容:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)$ $1.php [L]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^\.]+)$ $1.html [L]

当您向localhost/MyWeb/index发出请求时,Apache会检查localhost/MyWeb/index.phplocalhost/MyWeb/index.html是否存在,然后会先找到它找到的任何一个。

如果您同时拥有PHP和HTML文件,那么将提供PHP文件,而不是HTML文件。如果您更喜欢提供HTML文件,请交换两个块。

不幸的是,我不知道强制使用尾随斜杠的好方法,特别是因为检查它们存在的条件。换句话说,如果你请求sub2/并使用trailins斜杠,它将无效,因为它需要检查sub2/.php是否存在,而不是。{/ p>

更新为了获得额外的好处,请将这两个块放在您之前设置的新RewriteBase下方,以便将旧URI重定向到新URI,同时允许重写新URI到还在工作:

RewriteCond %{THE_REQUEST} \/project\.php\?id=([0-9]+) [NC]
RewriteRule ^ project/id/%1/ [R=302,L,QSD]

RewriteCond %{THE_REQUEST} \/MyWeb/(.+)\.(php|html)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ %1 [R=302,L]

供参考,这是完整的文件:http://hastebin.com/gacapesoqe.rb