为什么这个简单的RewriteRule不起作用?

时间:2010-08-11 03:25:32

标签: php .htaccess mod-rewrite

这应该很简单,但我无法弄清楚。我有这个非常简单的mod_rewrite规则,它只是不想工作。这是.htaccess文件的全部内容。

RewriteEngine On
RewriteRule ^([A-Za-z0-9-_/\.]+)/?$ index.php?page=$1 [L]

如果我调用URL domain.com/foo,它应该将其重写为index.php?page = foo。但相反,它将它重写为index.php?page = index.php。我尝试了多个网址:

  • 的index.php?页= FOO
  • 的index.php
  • /富
  • /

在所有情况下,PHP都表现为“page”设置为“index.php”。这不是index.php的错,因为我用一个简单回显'page'值的脚本替换了index.php的全部内容,它仍然以index.php的形式出现。

在我出错的地方真的输了,任何帮助都会很棒!

由于

阿德里安

2 个答案:

答案 0 :(得分:2)

任何原因你都不能使用更简单的东西,例如:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [L]

如果您试图阻止现有网页重写,那么!-f将负责(if file does not existif directory does not exist,然后re-write

答案 1 :(得分:0)

我认为这就是你要找的东西。不幸的是,如果URL有其他GET参数(IE,/ some / url / path?page = 1),它确实不能正常工作。

RewriteEngine On
RewriteRule ^(.*)$ index.php?page=$1 [L]

更好的主意。

RewriteEngine On
RewriteRule ^(.*)$ index.php [L,QSA]

QSA标志将转发GET参数,然后在index.php中使用$_SERVER['REQUEST_URI']parse_url来路由请求。

来自http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

'qsappend|QSA' (query string append)
This flag forces the rewriting engine to append a query string part
in the substitution string to the existing one instead of replacing it.
Use this when you want to add more data to the query string via a rewrite rule.