我有一个非常奇怪的问题
我正在玩.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。
任何帮助将不胜感激! =)
答案 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]