2010-04-22 59 views
5

我只安装具有以下的RewriteCond一个子域:如何让apache RewriteRule正确地为子域工作?

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

我用我的主域相同改写条件和它完美的作品。但是,当我在子域上设置它时,它只是在输出“index.php”时输出http://sub.domain.com

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

如何解决此问题?

+0

你有没有为通配符域做任何特殊的事情? (除了httpd.conf中的“ServerAlias * .example.com”)。 – Kdeveloper 2010-04-30 19:25:45

回答

0

这里想到几件事:

我有一些建议/意见/陷阱。希望其中之一对您有用:

  1. 确保search.php不只是回应其$_GET参数。虽然这在回顾过程中听起来很明显,但它是更容易被忽视的解决方案之一。
  2. RewriteRule当您在服务器配置文件中指定它时,与在.htaccess中指定它时略有不同。特别是,在使用整个URL时,^/在服务器配置版本中是错误的(http://sub.domain.com/blah)。
  3. 请确保没有其他重写规则正在为此子域首先处理,无论是在主httpd.conf/apache2.conf还是.htaccess中。
  4. 确保RewriteEngine On出现在您的配置中,因为它是按每个VirtualHost激活的。
  5. NS标志将忽略使用相对的Redirect或相对的RewriteRule完成的重定向。
+0

'^ /'完美的作品,整个域是**不**使用。只有路径。 – 2010-04-29 03:06:21

+0

另外,如果在.htaccess文件中激活RewriteEngine,请确保AllowOverride设置为适当的值。 – 2010-07-01 23:11:31

0

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

我会激活RewriteLog,将RewriteLogLevel启动到3级或更高级别,并查看您的模式是否完全匹配。如果不是,从一个更简单的模式开始,然后按照更复杂的模式工作。

或者,其他的东西是匹配的模式,所以请求永远不会'RewriteRule^/?([^ /] +)$'。你会在RewriteLog中看到这个。

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

1

我还没有玩过你的确切正则表达式与mod_rewrite,但如果我正在看写在另一个引擎中的正则表达式,我将不得不逃脱斜线。此外,鉴于$用于指示后向引用,是否也需要转义(在正则表达式中您的$符号是否必要,因为URI中可能有更多的文本,并且它不匹配字符串的末尾)?

我会尝试其他

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

一两件事。正则表达式$在正则表达式的结尾意味着“只有匹配,如果这是字符串的结尾”。因此,如果RewriteCond匹配^搜索。php $,但URL是search.php?q = ...然后我会认为这不匹配,因为search.php不是字符串的结尾。所以这看起来像下面(假设你不需要需要改变你原来的其他东西)。

RewriteCond $1 !^search.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 
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]