如何让RewriteRule重定向现有和不存在的页面?

时间:2014-08-30 00:51:56

标签: php apache .htaccess mod-rewrite redirect

目标:将所有请求(无论目录/文件是否存在)发送至http://example.com/index.php

我尝试了什么:

Rewrite Engine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://example.com/index.php [L]

它可以很好地重定向不存在的目录/文件的URL,但是当我访问现有的子目录并且文件http://example.com/test/test.php时,它只给我test.php页面的内容而不是主{{1}页面。

如果我理解正确,index.phpRewriteCond %{REQUEST_FILENAME} !-f会告诉它执行RewriteCond %{REQUEST_FILENAME} !-d如果满足这些标准,这就是为什么它只重定向不存在的目录和文件。但是我已经尝试删除那些RewriteRule了,它所做的就是将我的网站放到重定向循环中。

我也尝试过做

RewriteCond

但它根本不会重定向。

我需要做些什么来实现这个目标?

2 个答案:

答案 0 :(得分:1)

您的第一个示例只会将您不存在的内容重定向到index.php作为您所拥有的条件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

基本上意味着如果文件或目录不存在,请执行此操作。

你的第二个例子甚至是最糟糕的,因为它试图查看文件,目录是否存在而且不存在是没有意义的。


要将现有或不存在的任何内容重定向到主要处理程序index.php,您只需要以下内容:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !^/index.php$ [NC]
RewriteRule ^ index.php [L]

该条件确保您不会将其重定向到自己以防止循环。如果您运行的是HTTPD 2.4及更高版本,则可以使用:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteRule ^ index.php [END]

标志[END]负责不执行任何进一步的重定向。

答案 1 :(得分:0)

如果您想重定向任何网址,只需使用RewriteRule,这样它就会将任何不存在/不存在的文件/目录重定向到RewriteRule规则

RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteRule ^(.*)$ index.php [L]