简单的mod_rewrite问题

时间:2012-08-16 17:35:41

标签: php .htaccess mod-rewrite

我有一个非常奇怪的问题

我正在玩.htaccess并尝试将所有请求重定向到/ test /文件夹的索引文件。

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

我的期望: 当我访问任何网址时(例如/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。

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

2 个答案:

答案 0 :(得分: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)上,则可能需要设置适当的规则以允许默认错误文档。对于错误情况,某些共享Web主机提供单个文件(failed_auth.html是一个示例)。如果您没有过滤掉这种情况,最终可能会得到404。

答案 1 :(得分: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]