【问题标题】:URL Rewriting with multiple rules: wrong $_GET variable使用多个规则重写 URL:错误的 $_GET 变量
【发布时间】:2014-06-23 12:46:26
【问题描述】:

我对 URL 重写非常陌生。我想要实现的是有两个主要规则:

  1. 隐藏所有 .php 扩展名
  2. domain.com/p.php?id=1 重写为domain.com/p/1

这是我目前所拥有的:

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 的数据库查询实际上可以工作,现在我知道该值是错误的,这对我来说似乎很奇怪。

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

谢谢!

【问题讨论】:

  • RewriteRule ^(.*)$ $1.php 是这里的毒物民意调查

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


【解决方案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.php 吗?如果我只保留这个,似乎 domain.com/test 不会重写为 domain.com/test.php 并抛出 404。
【解决方案2】:

如果你只是想重写数值,你应该限制你的第二条规则:

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

【讨论】:

  • 您好,感谢您的回复!但是,此规则似乎触发了 500 Internal Server Error。 :-/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2011-03-12
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多