mod_rewrite不能正常工作

时间:2012-03-16 14:53:40

标签: php apache .htaccess mod-rewrite url-rewriting


我正在尝试重写URL如下:

  • www.example.com/module-name(/)=> handler.php?模块=模块名称
  • www.example.com/module-name/list/of/arguments(/)=> handler.php?module = module-name& args = list / of / arguments(我稍后会在脚本中爆炸)

如果缺少或不允许模块名称,则会加载网站的主页。这里没问题。
问题是mod_rewrite不能正常工作。我写了这些重写规则......

RewriteEngine On

RewriteRule ^([^/]*)/?$     handler.php?module=$1
RewriteRule ^([^/]+)/(.+)/?$    handler.php?module=$1&args=$2

...但不是将模块名称作为模块传递给处理程序,而是重写引擎传递脚本本身的名称, handler.php 即可。我在过去两天尝试使用不同的正则表达式,但结果总是一样的。我不知道该怎么办了!

重写规则在.htaccess中,放在文档根目录中(与handler.php一起),我在Ubuntu 11.10 64位机器上运行xampp。

提前致谢!

2 个答案:

答案 0 :(得分:3)

是的,在重写发生后,它会进入下一个周期,而不是像你期望的那样立即存在。

您需要更改规则(或添加单独的条件)以忽略对handler.php文件的请求。例如:

RewriteRule ^(?!handler\.php)([^/]*)/?$ handler.php?module=$1 [L]
RewriteRule ^(?!handler\.php)([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 [L]

或有额外的单独条件:

RewriteCond %{REQUEST_URI} !/handler\.php$
RewriteRule ^([^/]*)/?$ handler.php?module=$1 [L]

RewriteCond %{REQUEST_URI} !/handler\.php$
RewriteRule ^([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 [L]

甚至是这样:

# do not touch requests to handler.php
RewriteRule ^handler\.php$ - [L]

# our rewrite rules
RewriteRule ^([^/]*)/?$ handler.php?module=$1 [L]
RewriteRule ^([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 [L]

你也可以这样做(这实际上取决于你的重写逻辑)

# do not do anything for requests to existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

# our rewrite rules
RewriteRule ^([^/]*)/?$ handler.php?module=$1 [L]
RewriteRule ^([^/]+)/(.+)/?$ handler.php?module=$1&args=$2 [L]

答案 1 :(得分:1)

问题可能是现有的文件名也会被重写。为避免这种情况,您可以添加:

RewriteCond %{REQUEST_FILENAME} !-f   # ignore existing files
RewriteCond %{REQUEST_FILENAME} !-d   # ignore existing directories

所以对你来说就是:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f   # ignore existing files
RewriteCond %{REQUEST_FILENAME} !-d   # ignore existing directories
RewriteRule ^([^/]*)/?$     handler.php?module=$1

RewriteCond %{REQUEST_FILENAME} !-f   # ignore existing files
RewriteCond %{REQUEST_FILENAME} !-d   # ignore existing directories
RewriteRule ^([^/]+)/(.+)/?$    handler.php?module=$1&args=$2