【问题标题】:MOD_REWRITE is not behaving as expectedMOD_REWRITE 未按预期运行
【发布时间】:2012-02-18 05:02:00
【问题描述】:

这不起作用:

RewriteRule ^([^/]+)([/]?)$ /index.cgi?l=$1 [NC,L]

这不起作用:

RewriteRule ^([^/]+)/?$ /index.cgi?l=$1 [NC,L]

.htaccess 文件中没有其他规则。这是完整版本:

Options -Indexes
Options ExecCGI
AddHandler cgi-script .cgi .pl .q
ErrorDocument 500 /error500.cgi
ErrorDocument 404 /error404.cgi
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteRule ^([^/]+)/?$ /index.cgi?l=$1 [NC,L]

这确实有效,但这不是我想要的。

RewriteRule ^([^/]+)/([^/]+)$ /index.cgi?l=$1&a=$2 [NC,L]

我希望第一个斜杠和第二个目录都是可选的。为什么问号不会像它应该的那样匹配 0 或 1 个实例?吓死我了……

【问题讨论】:

  • “不起作用”到底是什么意思?从头开始,解释你想要做什么。
  • 抱歉,我正在尝试将“目录”名称作为变量传递给 CGI 脚本。但是第二个“目录”可能会或可能不会像前面的正斜杠一样被请求。

标签: regex mod-rewrite


【解决方案1】:

通过使用$,您指定它是文本的结尾,因此不会匹配/ 之后的任何内容。 (在正则表达式中,^ 指定字符串的开头,$ 指定结尾)

您可以删除 $,然后它会使第二个参数成为可选参数 - 这听起来像您要找的。​​p>

试试这个看看你的 mod_rewrite 是否正常工作:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [R,L]

【讨论】:

  • codeRewriteRule ^([a-z]+)/?([a-z]+)? /index.cgi?l=$1&a=$2 [NC,L]code 产生以下 Apache 错误页面: Found 文档已移至此处。 [与请求的链接相同] 此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。 Apache/1.3.37 服务器位于 www.mysite.org 端口 80
  • 嗯,不知道$是不是必须的。所以试试这个:RewriteRule ^([^\/]+)\/?(.+)?$ 那应该给你第一个 / 的内容。
  • 我尝试了你的建议。这次我设置了 R 标志,以便它重定向,我可以看到它的去向,这是我得到的 URL(振作起来):mysite.org/index.cgi?l=http:&a=/www.mysite.org 它正在测试整个 URL??
  • 嗯,这是非常不寻常的行为。尝试一些简单的事情,像这样看看你的 mod_rewrite 是否正常工作:......添加到我的答案中,因为无法格式化 cmets。
  • 我就是这么想的!在过去的几天里,我一直在与 MOD_REWRITE 作斗争,并且一直得到完全出乎意料的结果和错误。要么我像两块木板一样厚,要么模块完全违反直觉,或者我的服务器软件有些有趣!谢谢您的帮助。 :)
猜你喜欢
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2016-03-31
  • 2014-11-12
  • 1970-01-01
  • 2020-06-28
  • 2018-01-18
相关资源
最近更新 更多