我正在尝试重写URL如下:
如果缺少或不允许模块名称,则会加载网站的主页。这里没问题。
问题是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。
提前致谢!
答案 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