mod_rewrite实际上并没有...重写URL

时间:2011-10-14 21:30:49

标签: .htaccess mod-rewrite

基本上,我一直在尝试使用mod_rewrite通过.htaccess创建一些友好的URL - 我已经设法让它工作......但只有基本的东西,如:

RewriteEngine On 
RewriteBase / 
RewriteRule ^profile.php http://www.google.co.uk [L]

所以mod_rewrite有效,我可以重定向到其他站点,我服务器中的其他文件/目录等等 - 但是当我使用它时它似乎不起作用:

RewriteEngine On 
RewriteBase / 
RewriteRule ^profile.php?user=$1 ^profile/user/([^/]*)/$ [L]

对此的任何帮助都会很棒,因为我非常喜欢mod_rewrite,但这是我需要学习的东西。

干杯!

3 个答案:

答案 0 :(得分:0)

错误。

            ## rewriting from           to
RewriteRule ^profile.php?user=$1 ^profile/user/([^/]*)/$ [L]

应该是

            ## rewriting from           to
RewriteRule ^profile/user/([^/]+)$ profile.php?user=$1  [L]

答案 1 :(得分:0)

将[L]更改为[R,L]以强制实际的HTTP重定向。否则它只在内部进行重写(如果可能),这只会影响从URI到文件系统的映射。 (参见http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteflags处的[R]标志说明。)

答案 2 :(得分:0)

您的配置目前是:

RewriteEngine On
RewriteBase /
RewriteRule ^profile.php?user=$1 ^profile/user/([^/]*)/$ [L]

RewriteRule中,您将交换为参数。

假设您的服务器上有这样的目录结构:

/var/www/htdocs/profile/user/albert
/var/www/htdocs/profile/user/bob

然后您可以使用以下规则:

RewriteCond ${QUERY_STRING} ^user=(\w+)$
RewriteRule ^profile\.php$ profile/user/%1 [L]

有些观点你错了:

  • 首先将对“/profile.php?user=bob”的请求拆分为请求URI 查询字符串mod_rewrite仅使用请求URI。因此,您必须单独处理查询字符串。
  • 我将用户名限制为仅[A-Za-z0-9_]。如果我允许所有字符,攻击者可以轻松调用/profile.php?user=../../config.php,这将被重写为profile/user/../../config.php,您可能不希望与该世界共享该文件。
  • RewriteRule指令的参数在语法上完全不同。
    • 第一个参数(来自部分的)是一个正则表达式,通常以插入符^开头,以美元$结尾。
    • 第二个参数( to 部分)是替换,它几乎只是一个简单的字符串,只有一些特殊功能。此字符串通常不以插入符号开头,但看起来更像是路径名。