RewriteRule不能与htaccess一起使用

时间:2015-03-09 13:19:16

标签: php apache .htaccess mod-rewrite

我知道这个答案得到了最多的回答,但我无法找到适合我的解决方案。 我已经为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 所以,反向功能。 我做错了什么?

2 个答案:

答案 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所述及其中的图像:

enter image description here

即使激活了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