【问题标题】:Friendly URLs and htaccess levels友好的 URL 和 htaccess 级别
【发布时间】:2015-02-27 17:03:34
【问题描述】:

我有这个 .htaccess

RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]

如果 index.php 和 .htaccess 位于同一个文件夹中,它可以工作。

我想将 .htaccess 文件放在根目录中,并使放在 newFolder 中的内容对 htaccess 规则作出反应。说:

.htaccess -> 根级别
index.php -> 根/新文件夹级别

我试过了:

RewriteEngine On
RewriteRule ^custom newFolder/index.php?page=value [NC,L]

完全没有反应 (404) :(

我想解决方案一定很简单,但是...

任何帮助将不胜感激。

【问题讨论】:

  • 您希望“自定义”是动态的吗?还是应该是硬编码的?另外,您是否希望“page=”之后的“value”是动态的?如果是这样,你想从哪里获得“价值”的价值? :S

标签: php apache .htaccess mod-rewrite


【解决方案1】:

让我们确保我们在同一页面上。 ;) 在我的服务器根目录中,我有一个 .htaccess 文件,在该文件中我有:

RewriteEngine On
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L]

RewriteRule 包含三个组件:匹配模式、目标和标志列表。匹配模式可以包含纯文本或正则表达式。目标可以包含纯文本或带有在正则表达式匹配模式中捕获的混合变量的文本。匹配模式和目标都相对于 .htaccess 文件所在的目录。

匹配模式与当前目录之后的 URL 中的文本进行比较。如果匹配成功,则从 .htaccess 文件所在的目录调用目标。如果在匹配模式中捕获信息,则首先在目标中插入目标中的变量。

在本例中,.htaccess 文件位于服务器根目录中,因此匹配模式将与以下 URL 文本进行比较:http://localhost/

为了测试它,这是我放在 index.php 文件中的 PHP 代码:

<?php

echo 'page value: ' .$_GET['page'] . '<br>';
echo 'script loaded: ' . $_SERVER['PHP_SELF'];

?>

当我在浏览器中导航到 http://localhost/custom 时:正则表达式匹配模式与字符串“custom”进行比较,匹配成功,因此目标 index.php?page=value 被执行,我得到 index.php 页面加载的根目录。显示的页面如下所示:

page value: value
script loaded: /index.php

接下来,我在服务器根目录中创建一个名为 "newFolder" 的新目录,并将 index.php 文件复制到新创建的目录中。

当我在浏览器中导航到 http://localhost/newFolder/custom 时:正则表达式匹配模式与字符串 “newFolder/custom” 进行比较,再次成功匹配,这次是目标 newFolder/index.php?page=value被执行,并且我在加载的 newFolder 目录中获得了 index.php 页面。现在显示的页面如下所示:

page value: value
script loaded: /newFolder/index.php

同样,我可以在根目录中创建任意数量的目录并在这些目录中创建新的 index.php 文件,当导航到这些目录中的“自定义”时,这个 .htaccess 文件应该在当前子目录中加载相应的 index.php 文件。

~~~

我将在这里冒险并假设您要动态加载页面,因此将“自定义”捕获为动态页面名称并将其转储到页面字段中(替换“值”)并将其发送到当前子目录下的 index.php 文件。

RewriteEngine On

RewriteCond %{REQUEST_URI} !index\.php
RewriteRule ^(.+/)?(.+)$ $1index.php?page=$2 [NC,L]

如前所述,括号捕获动态文本并将其转储到美元符号数字所在的目标字符串中。因此,第一组括号中捕获的文本替换了“$1”,第二组括号中捕获的文本替换了“$2”。我还添加了RewriteCond 语句以防止此规则重复使用。 :) 如果我不这样做,则“自定义”调用和重定向到 index.php 都会执行此规则。

所以现在当我导航到http://localhost/newFolder/whoopdeedoo 时,正则表达式匹配模式与“newFolder/whoopdeedoo”进行比较,匹配成功,目标newFolder/index.php?page=whoopdeedoo 被执行,我得到:

page value: whoopdeedoo
script loaded: /newFolder/index.php

~~~

冒着嗡嗡声的风险,这里有一些背景信息。您提到这在根目录中有效:

RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]

但在浏览器导航到子目录时它不起作用。阅读 cmets 后,您似乎发现下一点适用于子目录,特别是“newFolder”:

RewriteEngine On
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L]

但现在它不再适用于根目录。所以你可以简单地包括两者:

RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L]

但是,这里有几件事让我很震惊。一是我宁愿将 .htaccess 文件放在每个子目录中并接管那里的 URL 处理,而不是在我的根 .htaccess 中硬编码目录名称。

但是,如果出于某种原因,您更愿意在根目录中维护一个 .htaccess 文件,那么,让我大吃一惊的是规则中的重复。因此,或者,您可以使用正则表达式使子目录名称成为捕获的变量,如本答案顶部所示:

RewriteEngine On
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L]

正则表达式捕获括号替换了文本“newFolder/”,在括号内我们说的是“捕获一个或多个字符,后跟一个正斜杠”。然后,如果匹配成功,则捕获的值将替换目标中的“$1”。这也适用于根目录的原因是括号后面的问号使括号内的正则表达式是可选的。因此,如果“自定义”之前没有任何内容,我们仍然适合比赛。在这种情况下,“$1”将被替换为空字符串。

【讨论】:

  • 这正是我一直在寻找的:这个特定项目的非动态自定义 url。无论如何,您发送的所有信息都非常有用。非常感谢bloodyKnuckles,并有一个美好的新年。 :)
  • @anubhava:不错且准确的答案。也容易休闲。所以,我们这里有一个非常有才华的伙伴:)
【解决方案2】:

试试这个rewriterule:

# Activate RewriteEngine
RewriteEngine on
 
# Rewrite the URL requested by the user
#   Entry:  folder/clients/name/
#   Output: folder/clients.php?id=name
RewriteRule ^folder/clients/(\w+)/?$ /folder/clients.php?id=$1

这个重写的解释:

rewriterule的第一部分:

  1. ^ 热门表情
  2. folder/clients/ 请求的 URL 字符串以 folder/clients/ 开头
  3. (\w+) 捕获后面的任何字母并将其存储在$1
  4. /? 网址末尾的可选反斜杠
  5. $ 表达式结束

rewriterule的第二部分:

  1. clients.php?id= 文本字符串
  2. $1 我们在第一部分看到的第一个捕获

【讨论】:

  • 没用。在您的代码中,“客户”是一个文件夹还是可以是一个自定义词?感谢您的回复。
  • 我编辑了我的答案。我认为您需要在RewriteRule 中写入子目录的名称。
  • 也许这个答案可能对你更有用:stackoverflow.com/questions/9262720/…
  • 感谢 tomloprod。我稍后再试(我现在必须照顾我的客人)。新年快乐。
  • Feliz año tomlodrop :) 我确实使用了“更新”规则,但避免将变量和文件名作为友好字符串的一部分。像这样:RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L] --- 非常感谢!
猜你喜欢
  • 2015-12-16
  • 2013-02-03
  • 2013-08-31
  • 2012-06-03
  • 2015-04-17
  • 2017-04-12
  • 2011-05-29
  • 2013-01-22
相关资源
最近更新 更多