我只是使用以下RewriteCond设置子域:
RewriteCond $1 !^search.php$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS]
我在我的主域上使用相同的重写条件,它完美无缺。但是,当我在子域上进行设置时,只需在转到http://sub.domain.com时输出“index.php”
子域中的每个页面都输出正文中的页面名称而不是处理代码,但搜索页面除外,它似乎正常工作。
我该怎么做才能解决这个问题?
答案 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)
这里有几件事情可以想到:
我有一些建议/评论/陷阱。希望其中一个对你有用:
$_GET
参数。虽然回想起来这听起来很明显,但却是一个被忽视的解决方案。RewriteRule
在服务器配置文件中指定时的工作方式与在.htaccess中指定的方式略有不同。具体而言,服务器配置版本中^/
错误,因为使用了整个网址(http://sub.domain.com/blah
)。RewriteEngine On
出现在您的配置中,因为它是按VirtualHost
激活的。Redirect
或相对RewriteRule
完成的重定向。答案 3 :(得分:0)
听起来模式'^ /?([^ /] +)$'可能根本不匹配。
我激活RewriteLog,将RewriteLogLevel调到3级或更高级别,看看你的模式是否匹配。如果没有,请从更简单的模式开始,然后按照更复杂的模式工作。
或者,其他东西与模式匹配,因此请求永远不会到达'RewriteRule ^ /?([^ /] +)$'。您将在RewriteLog中看到这一点。
我相信我最近遇到的问题是,在某些情况下,“^ /”在虚拟主机上不匹配。但'/'有效。 Freenode.org上#httpd的人帮助了我。如果我能在笔记中找到这个,我会在这里发布。