将查询字符串转换为目录视图

时间:2016-11-26 13:17:33

标签: php regex apache .htaccess mod-rewrite

我正在尝试使用htaccess mod-rewrite来更改我使用的一些链接。我非常擅长其他东西(PHP和MySQL)但是当涉及到这个htaccess时,我的思绪就离开了我。

这就是我想要的:

转换

mydomain.com/item.php?id=1

mydomain.com/item/1

以及如果页面变量也设置如下:

转换

mydomain.com/item.php?id=1&page=view
mydomain.com/item.php?id=1&page=remove

mydomain.com/item/view/1
mydomain.com/item/remove/1

但我也想将.php扩展隐藏在整个网站中,而不仅仅是item.php。像这样:

mydomain.com/item.php
mydomain.com/user.php

mydomain.com/item
mydomain.com/users

如果有人访问旧的无聊链接(item.php或item.php?id = 1),他们应该转发到他们更改的版本(/ item或/ item / 1)。

我这样做是为了隐藏php扩展名:

RewriteEngine On
RewriteCond %{THE_REQUEST} \s/+(.+)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,L,NE]

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

并且还使用查询字符串转发item.php:

RewriteRule ^item/([0-9]+)/?$ /item.php?id=$1

他们似乎分开工作但不在一起工作。我无法弄清楚如何使它适用于所有这些不同的东西。

我也希望能够使用

$_GET['id'] and $_GET['page']

在item.php中正常

1 个答案:

答案 0 :(得分:0)

您需要更多规则来完成所有这些工作:

Options -MultiViews
RewriteEngine On

# external redirect /item.php?id=1&page=view to /item/view/1
RewriteCond %{THE_REQUEST} \s/+item\.php\?id=([^\s&]+)&page=([^\s&]+) [NC]
RewriteRule ^ /item/%2/%1? [R=302,L,NE]

# external redirect /item.php?id=1 to /item/1
RewriteCond %{THE_REQUEST} \s/+item\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /item/%1? [R=302,L,NE]

# external redirect /user.php to /user
RewriteCond %{THE_REQUEST} \s/+(.+)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,L,NE]

# internal rewrite /item/view/1 to /item.php?id=1&page=view
RewriteRule ^item/([\w-]+)/(\d+)/?$ item.php?id=$2&page=$1 [L,QSA,NC]

# internal rewrite /item/1 to /item.php?id=1
RewriteRule ^item/(\d+)/?$ item.php?id=$1 [L,QSA,NC]

# internal rewrite /user to /user.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)$ $1.php [L]

参考文献: