【问题标题】:Rewrite rule working for 1-4 parameters but not for 1 parameter重写规则适用于 1-4 个参数但不适用于 1 个参数
【发布时间】:2014-07-27 20:06:24
【问题描述】:

我在我的网站上使用了以下 RewriteRule:

RewriteEngine On
RewriteRule ^([^/]*)$ /code.php?name=$1 [L]
RewriteRule ^([^/]*)/([^/]*)$ /code.php?name=$1&state=$2 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /code.php?name=$1&state=$2&district=$3 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /code.php?name=$1&state=$2&district=$3&city=$4 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /code.php?name=$1&state=$2&district=$3&city=$4&branch=$5 [L]

所有最后 4 条规则都工作正常,但第一个规则在访问时抛出 500 错误。我试验了一个小时。最终得到了一个有点奇怪的解决方案。我编辑了第一条规则:

 RewriteRule ^([^/]*)/$ /code.php?name=$1 [L]

当我在查询参数后添加正斜杠时它可以工作,但是当没有正斜杠时会抛出 404 错误。

任何帮助都会很棒!干杯。

【问题讨论】:

  • 500 错误或错误 500?请添加生成错误的示例 URI。

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

使用+ 量词而不是* 并颠倒您的规则顺序:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ /code.php?name=$1&state=$2&district=$3&city=$4&branch=$5 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ /code.php?name=$1&state=$2&district=$3&city=$4 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /code.php?name=$1&state=$2&district=$3 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/?$ /code.php?name=$1&state=$2 [L,QSA]
RewriteRule ^([^/]+)/?$ /code.php?name=$1 [L,QSA]

【讨论】:

  • 达姆!同样的错误。删除?您的答案的最后一条规则使它起作用,但带有正斜杠,如果正斜杠不存在,则抛出 404 错误。 :(
  • 哪个 URL 给你 500 错误,哪个给你 404?
  • 当我编辑你答案的最后一条规则时,它可以工作,即 RewriteRule ^([^/]+)/$ /code.php?name=$1 [L,QSA] 这不是$前的问号。但是我必须在 URL 的末尾添加一个正斜杠,否则会生成错误 404。
  • 这里是生成错误的示例 URL:Bankcodes.co。尝试删除 URL 末尾的正斜杠。
  • 它给出了 500 错误,因为这个正则表达式 ^([^/]+)/?$ 匹配 /HDFCBank 然后目标 URI /code.php 也导致它无限循环。由于/code.php^([^/]+)/$ 不匹配,因此在课程末尾添加了斜线500 已解决。但是它不会匹配 /HDFCBank 并生成 404。现在使用第一个规则,它可以避免现有文件和目录的所有以下规则并停止无限循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 2013-09-02
相关资源
最近更新 更多