【问题标题】:Htaccess reverse lookup directory tree script existHtaccess 反向查找目录树脚本存在
【发布时间】:2013-11-22 20:50:31
【问题描述】:

是否可以让 htaccess 运行目录直到找到一个并保持正常的 get 完整?例如:

/foo/bar/foobar/test/something?foo=bar&bar=foo

脚本在哪里 /foo/bar/foobar.php 和 foobar.php 有:

array(2)
[foo] = bar,
[bar] = foo

并且测试/某事在某处传递,例如在另一个获取名称“路径/参数”中。

我得到了这个,但它不能很好地处理:

RewriteEngine On
RewriteBase /

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

RewriteCond %{DOCUMENT_ROOT}/$1/$2.php !-f
RewriteCond %{QUERY_STRING} ^(?:param=)?(.*)$
RewriteRule ^(.*?)/([^/]+)/?$ $1/?param=$2/%1 [L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

提前致谢

编辑

目前我遇到以下问题:

我有一个名为 /page.php 的页面,但这个 page.php 会检查某些“选项”,例如 /page/homepage。这可行,但是当我添加 /page/homepage?foo=bar 时,当前的 htaccess 使其成为 'homepage/foo=bar' 而不是单独的获取。 我爆炸了参数 get on / 并给了我以下信息:

array (size=3)
  0 => string 'page' (length=4)
  1 => string 'homepage' (length=8)
  2 => string 'foo=bar' (length=7)

foo=bar 不应该在那里,应该是 $_GET['foo'] 或其他任何名称,如果有更多名称,则会在其后获得更多名称。例如:

array (size=3)
  params => string 'page/homepage' (length=13)
  foo => string 'bar' (length=3)
  bar => string 'foo' (length=3)

当前 htaccess 将第一个 get 视为 'param' 的一部分。

edit2

我想实现以下目标:

使用 htaccess 转到页面 /page.php,它应该看起来像 /page/homepage?background=someColor

在 homepage.php 脚本中,我想获取“主页”作为页面变量,并且获取背景应该可以工作。

【问题讨论】:

  • 我不清楚您的问题?你能试着用更多的例子来解释吗?
  • 很抱歉,即使在阅读您的原始和编辑问题 10 多次后,我仍无法理解您的问题是什么以及您想要什么。
  • @anubhava 试图简化它
  • 好的,请参阅下面的答案。我怀疑您正在规则中寻找 QSA 标志。
  • 基本上是这个stackoverflow.com/questions/10487909/htaccess-reverse-directory,然后是'working gets'

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

试试这个代码:

RewriteEngine on

RewriteBase /

# If the request is for a valid file
RewriteCond %{REQUEST_FILENAME} -f [OR]
# If the request is for a valid link
RewriteCond %{REQUEST_FILENAME} -l
# don't do anything
RewriteRule ^ - [L]

# if current ${REQUEST_URI}.php is not a file then
# forward to the parent directory of current REQUEST_URI
RewriteCond %{DOCUMENT_ROOT}/$1/$2.php !-f
RewriteRule ^(.*?)/([^/]+)/?$ $1/?param[]=$2 [L,QSA]

# if current ${REQUEST_URI}.php is a valid file then 
# load it be removing optional trailing slash
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

【讨论】:

  • 请看上面的评论。
  • 好的,现在我记得经过大量研究后写下这个答案。但是这个答案有什么问题呢?
  • 我希望 htaccess 忽略任何 ?get=var&in=the&request=itgets 并在解决后附加它。由于某种原因,问号(?)在 htaccess 中的某处被删除。因此被 php 忽略为 get 变量。
  • hmm QUERY_STRING 不应该被丢弃。让我测试一下。
  • 刚刚运行了一个请求http://localhost/index/foo/bar/baz?color=red并得到了$_SERVER["QUERY_STRING"] = color=red
猜你喜欢
  • 2012-05-16
  • 2010-10-05
  • 2016-07-22
  • 1970-01-01
  • 2022-10-24
  • 2010-10-31
  • 2014-09-04
  • 2017-01-12
  • 1970-01-01
相关资源
最近更新 更多