如何让apache RewriteRule正常运行子域?

时间:2010-04-22 22:00:02

标签: apache mod-rewrite

我只是使用以下RewriteCond设置子域:

RewriteCond $1 !^search.php$  
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 

我在我的主域上使用相同的重写条件,它完美无缺。但是,当我在子域上进行设置时,只需在转到http://sub.domain.com时输出“index.php”

子域中的每个页面都输出正文中的页面名称而不是处理代码,但搜索页面除外,它似乎正常工作。

我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:1)

我没有使用mod_rewrite使用你的确切正则表达式,但如果我正在考虑在另一个引擎中编写正则表达式,我将不得不逃避斜线。另外,假设$用于表示后引用,那么它是否也需要转义(正则表达式中的$符号是否必要,因为URI中可能有更多文本并且在字符串末尾不匹配)?

我会尝试

RewriteCond $1 !^search.php$  
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^\/]+)$ search.php?q=$1 [L,NS] 

另一件事。正常情况下,正则表达式结尾处的$意味着“只有匹配,如果这是字符串的结尾”。所以,如果RewriteCond匹配^ search.php $,但URL是search.php?q = ...那么我认为这不匹配,因为search.php不是字符串的结尾。所以看起来如下(假设您需要更改原始内容中的任何其他内容)。

RewriteCond $1 !^search.php
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 

答案 1 :(得分:1)

在主配置中,路径始终以/开头,您需要一个绝对路径:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^search.php$                                                                                                                                                                             
RewriteCond %{REQUEST_FILENAME} !-f                                                                                                                                                                                       
RewriteRule ^/([^/]+)$ %{DOCUMENT_ROOT}/search.php?q=$1 [L]   

在.htaccess中你需要一个从url中删除的RewriteBase(现在规则中没有/),路径是相对的。

RewriteEngine On
RewriteBase /                                                                                                                                                                                                             
RewriteCond %{REQUEST_FILENAME} !^search.php$                                                                                                                                                                             
RewriteCond %{REQUEST_FILENAME} !-f                                                                                                                                                                                       
RewriteRule ^([^/]+)$ search.php?q=$1 [L]   

答案 2 :(得分:0)

这里有几件事情可以想到:

我有一些建议/评论/陷阱。希望其中一个对你有用:

  1. 确保search.php不只是回显其$_GET参数。虽然回想起来这听起来很明显,但却是一个被忽视的解决方案。
  2. RewriteRule在服务器配置文件中指定时的工作方式与在.htaccess中指定的方式略有不同。具体而言,服务器配置版本中^/错误,因为使用了整个网址(http://sub.domain.com/blah)。
  3. 首先确保没有为此子域处理其他重写规则,无论是在主httpd.conf / apache2.conf还是.htaccess中。
  4. 确保RewriteEngine On出现在您的配置中,因为它是按VirtualHost激活的。
  5. NS标志将忽略使用亲戚Redirect或相对RewriteRule完成的重定向。

答案 3 :(得分:0)

听起来模式'^ /?([^ /] +)$'可能根本不匹配。

我激活RewriteLog,将RewriteLogLevel调到3级或更高级别,看看你的模式是否匹配。如果没有,请从更简单的模式开始,然后按照更复杂的模式工作。

或者,其他东西与模式匹配,因此请求永远不会到达'RewriteRule ^ /?([^ /] +)$'。您将在RewriteLog中看到这一点。

我相信我最近遇到的问题是,在某些情况下,“^ /”在虚拟主机上不匹配。但'/'有效。 Freenode.org上#httpd的人帮助了我。如果我能在笔记中找到这个,我会在这里发布。