使用多个规则重写URL:错误的$ _GET变量

时间:2014-05-06 18:46:11

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

我对URL重写很新。我想要实现的是有两条主要规则:

  1. 隐藏所有.php扩展程序
  2. domain.com/p.php?id=1重写为domain.com/p/1
  3. 这是我到目前为止所拥有的:

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php
    RewriteRule   ^p/(.+)$   p.php?id=$1   [L]
    

    这似乎最初起作用:所有.php扩展名都被隐藏,输入domain.com/p/1显示domain.com/p.php?id=1。

    但是,我刚刚意识到此页面上的PHP GET方法选择了错误的值:虽然我希望它选择1,但它实际上会选择1.php/1。起初我没有注意到它,因为基于$_GET的数据库查询实际上有效,这对我来说似乎很奇怪,因为我知道这个值是错误的。

    我怎样才能使这两个重写规则的组合按预期工作?

    谢谢!

2 个答案:

答案 0 :(得分:1)

将此代码放在DOCUMENT_ROOT/.htaccess文件中:

RewriteEngine On

RewriteCond %{THE_REQUEST} \s/+p\.php\?id=([0-9]+) [NC]
RewriteRule ^ /p/%1? [R=301,L]

RewriteRule ^p/([0-9]+)/?$ /p.php?id=$1 [L,QSA,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f [NC]
RewriteRule ^(.+?)/?$ /$1.php [L]

答案 1 :(得分:0)

如果您只想重写数值,则应限制第二条规则:

RewriteRule   ^p/(\d+)$   p.php?id=$1   [L]