我正在尝试使用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中正常
答案 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]