htaccess重写url错误页面和id

时间:2017-02-27 07:42:56

标签: php apache .htaccess mod-rewrite

我想实现以下

  1. mydomain.com/anyword 等任何链接都应该重写为index.php?pg = $ 1
  2. 示例:

    mydomain.com/new -->index.php?pg=new
    
    mydomain.com/purchased -->index.php?pg=purchased
    
    mydomain.com/login -->index.php?pg=login
    
    1. mydomain.com/anyword/anynumber 等任何链接都应该重写为index.php?pg = $ 1& id = $ 2
    2. 示例:

      mydomain.com/new/12 -->index.php?pg=new&id=12
      
      mydomain.com/purchased/240 -->index.php?pg=purchased&id=240
      
      mydomain.com/login/10 -->index.php?pg=login&id=10
      

      我使用了以下htaccess代码。 第一个正常工作。 关于第二个,整个参数传递给pg,根本没有参数id。

      就是网址     mydomain.com/purchased/240 在我的PHP $ _Get只有​​' pg'参数和' id'参数完全没有 和pg = / purchase / 240

      请建议正确的方法。

      RewriteEngine on
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ /index.php?pg=$1 [NC,QSA]
      RewriteRule ^([^/]+)/(\d+)/.*$ /index.php?pg=$1&id=$2 [NC,QSA]
      

      由于

      编辑:如果有人需要,可以提供正确的解决方案

      Options +FollowSymLinks
      RewriteEngine on
      
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^([A-Za-z0-9-]+)/([0-9]+) /index.php?pg=$1&id=$2 [NC,L,QSA]
      
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ /index.php?pg=$1 [NC,QSA]
      

1 个答案:

答案 0 :(得分:0)

这是因为全能模式。 (。*)匹配所有内容并将其重写为目标。对于您的示例,您的第一条规则与两个请求匹配, / foobar / / foobar / 123 被重写为 /index.php?pg=request 。要解决此问题,您需要修复规则的顺序,您需要将特定规则放在全能规则之前:

RewriteRule ^([^/]+)/(\d+)/?$ /index.php?pg=$1&id=$2 [L]
RewriteRule ((?!index.php).+) /index.php?pg=$1 [L]