.htaccess Apache mod重写给出404错误

.htaccess Apache mod重写给出404错误,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我正在尝试设置一个简单的重写规则来转换url,例如: index.php?page=login 差不多 page/login RewriteEngine on RewriteEngine off RewriteRule ... 然而,我不断收到404个错误 有人能解释一下为什么下面的方法可能不起作用吗 .htaccess: RewriteEngine on RewriteRule ^page/([^/\.]+)/?$ index.php?page=$1 [L] rewriteEng

我正在尝试设置一个简单的重写规则来转换url,例如:

 index.php?page=login
差不多

 page/login
RewriteEngine on
RewriteEngine off
RewriteRule ...
然而,我不断收到404个错误

有人能解释一下为什么下面的方法可能不起作用吗

.htaccess:

RewriteEngine on

RewriteRule ^page/([^/\.]+)/?$ index.php?page=$1 [L]

rewriteEngine off
我对这一点很陌生,任何建议都将不胜感激。
谢谢。

请确保使用RewriteBase

这些是我通常使用的规则。 他们说,任何不是文件或目录的请求都由index.php处理 在脚本中,请求的URI可通过
$\u服务器['REQUEST\u URI']
获得

RewriteEngine On
RewriteBase /some_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /some_dir/index.php [L]

我想你可以把它拿走。是否希望用户键入此内容

http://site.com/page/login
?

这是更符合逻辑的情况。如果是,请执行以下操作:

RewriteEngine On
RewriteBase /
RewriteRule ^/page/login$ /index.php?page=login [L]
或者,更一般地说:

RewriteRule ^/page/(\w+)$ /index.php?page=$1 [L]
重新启动发动机 重写规则^page/([^/]+)/?$index.php?page=$1[L] 发动机熄火
为什么要关闭重写引擎?

沃尔克提出了一个很好的观点:不要同时使用
打开重写引擎和
关闭重写引擎,因为你不是打开重写引擎,添加一条规则,然后再关闭它。Apache配置与编程不同,在编程中,您有一组计算机按顺序执行的指令。您可以想象它更像这样:当Apache解析其配置文件(如
.htaccess
)时,它首先读入所有指令,并按照应用它们的自然顺序对它们进行排序。这更像是在程序开始时初始化变量的值,无论您以什么顺序编写语句,结果通常都是相同的

在您的例子中,在同一个文件中同时指定
RewriteEngine on
RewriteEngine off
很可能会让Apache感到困惑,因为(在我的小比喻中)当Apache将指令按其“自然”顺序排序时,会出现如下结果

 page/login
RewriteEngine on
RewriteEngine off
RewriteRule ...

这可能会关闭重写引擎。但当然,实际发生的事情比仅仅将指令排序到列表中要复杂得多,因此您无法真正知道Apache将如何处理像您这样的文件。只是不要尝试为文件的不同部分打开或关闭重写引擎,记住Apache的配置指令不仅仅是要按顺序运行的语句。

谢谢大家,它现在可以工作了。我的问题是由于RewriteBase,或者说是因为缺少它。这是一个很好的调用,它也帮助我解决了我的问题,我在/clients中工作,得到了404,直到我添加了一个
RewriteBase/clients
,并从我的正则表达式中删除了我的
(?:clients)