我知道这个答案得到了最多的回答,但我无法找到适合我的解决方案。 我已经为url重写编写了一个.htaccess文件。我有一些网页whit GET url,如:
example.com/home.php?page=profile
example.com/home.php?page=forum
example.com/home.php?page=product&id=1
我需要从example.com/home.php?page=forum重定向到example.com/home/forum
所以,这是htaccess
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
RewriteRule ^/home/([A-Za-z0-9-]+)/?$ home.php?page=$1 [L,R=301]
SecFilterEngine Off
<Files .htaccess>
order allow,deny
deny from all
</Files>
Options All -Indexes
当我输入网址:example.com/home/forum时,我一直在重定向到example.com/home.php?page=forum 所以,反向功能。 我做错了什么?
答案 0 :(得分:1)
我对mod_rewrite的经验不是最少,并且经常对服务器配置的每个部分都很难,所以我在可能的地方作弊。因此,我使用了以下精湛的基于Web的重写工具: Mod Rewrite Generator
RewriteRule ^home/([^/]*)$ /home.php?page=$1
我解释生成的模式如下: 在类似于单词home的协议/域部分之后搜索某些内容,后跟斜杠,然后是除第二个斜杠之外的所有内容(因此/ home / forum / 1将无法识别)。将其替换为/home.php?page=forum,其中$ 1是对捕获组“除了斜线之外的所有内容”的反向引用。你必须摆弄它以满足你的需要。
如果您希望覆盖第二个用例(附加id参数),请添加另一个规则:
RewriteRule ^home/(.*)/(.*)$ /home.php?page=$1&id=$2
我认为我们都必须深入挖掘。如果你谷歌它,许多来源将告诉你在R = 301和302之间决定的重要性,因为你的选择将对谷歌网络抓取工具产生影响。您可以在这里找到紧凑的介绍/指南: Hidden features of mod_rewrite。由于该指南,我删除了[L,R = 301]。
我不希望你有任何赞成,因为我觉得答案不完整,代码是为了你的需要简单化。另外我使用了外部工具。
编辑(由Drew提供):
应该注意传递任何敏感数据的参数,如Troy Hunt article所述及其中的图像:
即使激活了SSL,通过服务器跳转到目标服务器也可以看到参数。与http POST数据相反。
答案 1 :(得分:0)
在www
删除
RewriteCond %{THE_REQUEST} \s/+home\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /home/%1? [R=302,L,NE]
RewriteRule ^home/([A-Za-z0-9-]+)/?$ home.php?page=$1 [L,QSA]
同时将Options
保持为:
Options +FollowSymLinks -MultiViews