2012-08-16 203 views
2

我有一个真正奇怪的问题简单的mod_rewrite问题

我与的.htaccess玩弄,并试图重定向到/测试/文件夹的索引文件的所有请求。

我的网站位于我的本地htdocs文件夹中的文件夹/ test /中。没有其他文件存在currenlty。

我想到: 当我访问的任何URL(例如/test/category/one/)我应该被重定向到/test/index.php

会发生什么 我得到一个404 Not Found

我的.htaccess的样子这个:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /test/index.php?__route=$1 [L,QSA] 

我试过设置RewriteBase /test/

这是直截了当的,所以为什么它不工作?

我有一个Wordpress网站在另一个文件夹中,并与自定义重写工作完美无瑕。

我甚至将Wordpress的.htaccess内容复制到测试网站,用/ test /替换重写基准和最后一条规则。

WordPress的的.htaccess:(这在一个单独的WP工程安装在同一服务器上)

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /test/ 
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /test/index.php [L] 
</IfModule> 

# END WordPress 

我一直在这个苦苦挣扎了一会儿,看了不少SO没有帮助文章。

我甚至写了一个重写日志文件,现在当我浏览到测试网站时没有显示任何内容,但访问Wordpress网站时写了很多行。

我在Win64机器上运行XAMPP。

任何帮助将不胜感激! =)

+1

“它不工作” - 你的问题很好的解释,我联系Charles Xavier来帮助我弄清楚“不起作用”对你意味着什么。 – hakre 2012-08-16 17:46:51

+0

@hakra对于不提及,我表示歉意。什么'不起作用'是重写规则没有得到执行,我得到了'404 Page Not Found'错误。应该发生的事情是我被重定向到/test/index.php – tone7 2012-08-16 17:59:17

+0

'。'恰好匹配一个字符,并且没有捕获的组。尝试'(。+)'。 – 2012-08-16 18:00:00

回答

5

更新:此外,请确保您的.htaccess文件中的行结尾设置得当。有时Apache可能会阻塞任何不包含新行(\ n)字符的内容。

因此,它看起来像我想要(在某种程度上)模拟WordPress正在做什么。下面是我如何处理这种情况下,当我开发一些软件,做同样的事情:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /test 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L] 
RewriteRule ^.*$ /index.php [L] 
</IfModule> 

对于存在的文件(即无论是-f-d测试通过),我们为他们服务了不变。否则,我们将传入的请求重定向到index.php。请注意,路径的/test部分未包含在RewriteRule中,因为RewriteBase是从我们开始的地方设置的。因此,在您的示例中,我认为它最终会成为:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /test 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L] 
RewriteRule ^(.*)$ /index.php?__route=$1 [L,QSA] 
</IfModule> 

FWIW,我不是.htaccess专家。我只是发现这在过去为我工作。

另外,如果你是一个共享的主机(如DreamHost的),您可能需要设置相应的规则,以允许默认的错误文件。一些共享的网络主机提供一个文件(failed_auth.html是一个例子)用于错误情况。如果你没有过滤掉这种情况下,你可能最终有404

+0

感谢您的回复,但不幸的是,这也不起作用。 (即使它是一个只有.htaccess和index.php文件的空目录)另一件事,如果我复制并粘贴你的例子,我得到一个错误500错误服务器,但是当我把'#'在第一行,它给出了一个'404 Not Found'错误,这也很奇怪 – tone7 2012-08-16 19:21:19

+0

如果第一行给出错误500,那么你的Web服务器会以某种方式错误配置(例如,必须禁用mod_rewrite)。 。在 – 2012-08-16 19:24:51

+0

更多信息,您的服务器日志这是Apache的错误日志中的错误:' tone7 2012-08-16 19:34:34

2

这应该做的伎俩:

# Activate the rewrite module. 
RewriteEngine On 
# Ensure the requested URL is not a file. 
RewriteCond %{REQUEST_FILENAME} !-f 
# Ensure the requested URL is not a directory. 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^(.*)$ index.php?__route=$1 [L,QSA] 
+0

感谢您的答复,但不幸的是这也没有工作:( – tone7 2012-08-16 19:21:47

+0

现在这个代码工作。再次感谢,这是一个行结束的问题。只是一个供参考。见@约拿的答案评论。 – tone7 2012-08-17 16:48:02