2009-11-27 25 views
1

这里是我的.htaccess文件现代重写完整befuzzlement

Options +FollowSymlinks 
RewriteEngine On 
RewriteBase/

RewriteRule subpage\?sid /index.php [R=301,L,NC] 

我的要求是http://example.com/subpage?sid

它使返回404未找到,而不是重定向到index.php

我已经试过不逃避?并将请求更改为http://example.com/subpage\?sid

我已经尝试了大量的东西试图得到这个工作,但我现在难倒了。

+0

你有没有三'^重写规则子页面\?SID/index.php'? (注意插入^) – Pascal 2009-11-27 08:30:53

+0

现在我已经给出了这个答案,它确实属于ServerFault。 – outis 2009-11-27 08:50:30

+0

这是一种编程,所以在stackoverflow上可以。 – 2009-11-27 08:56:08

回答

4

QUERY_STRING不是URI的一部分。从文档RewriteRule

注:查询字符串

模式不会对查询字符串相匹配。相反,您必须使用带有%{QUERY_STRING}变量的RewriteCond。

正如医生说,你需要使用的RewriteCond,是这样的:

RewriteCond %{QUERY_STRING} (^|&)sid([&=]|$) [NC] 
RewriteRule ^/?subpage /index.php [R=301,L,NC] 

如果%{QUERY_STRING}确实不是一个选项,尝试:

# Apache is supposed to use PCRE, but doesn't seem to like "\\s" 
RewriteCond %{THE_REQUEST} subpage?sid[^!-~] [NC] 
RewriteRule ^/?subpage /index.php [R=301,L,NC] 

另外,你几乎从不需要使用RewriteBase(“RewriteBase /”)。评论这条线并进行测试,但您可能会发现可以将其删除而不会产生任何不良影响。

+0

我不能仅仅因为复杂的原因而使用QUERY_STRING,但你的答案确实有意义。以下依然给我404:RewriteCond%{THE_REQUEST}子页\ sid $ RewriteRule ^。* $ /index.php [R = 301,L,NC] – 2009-11-27 14:05:07

+0

这是因为“sid”不在% {THE_REQUEST};还有HTTP版本。为什么不能使用QUERY_STRING? – outis 2009-11-27 21:08:12

0

也许您需要检查您的站点的VirtualHost设置并设置相应目录的AllowOverride设置?

<Directory /var/www/vhosts/some_host> 
    .... 
    AllowOverride All 
</Directory> 

这里有更多关于Apache的AllowOverride