php - 友好的 URL 和 htaccess 级别

标签 php apache .htaccess mod-rewrite

我有这个 .htaccess

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

如果 index.php 和 .htaccess 位于同一文件夹中,则它有效。

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

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

我确实尝试过:
RewriteEngine On
RewriteRule ^custom newFolder/index.php?page=value [NC,L]

完全没有反应(404):(

我想解决方案必须很简单,但是......

任何帮助将不胜感激。

最佳答案

让我们确保我们在同一页面上。 ;) 在我的服务器根目录中,我有一个 .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 文件当前子目录。

~~~

我将在这里尝试一下,假设您想动态加载页面,因此将“自定义”捕获为动态页面名称并将其转储到页面字段中(替换“值”)并将其发送到索引。 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]

但是在将浏览器导航到子目录时它不起作用。阅读评论后,您似乎发现下一点适用于子目录,特别是“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”将被替换为空字符串。

关于php - 友好的 URL 和 htaccess 级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27723962/

相关文章:

regex - htaccess 目标特定文件

php - 如何根据数据库下拉列表的 mysql 计数来限制或停止表单提交?

php - 如何通过 HTML 中的按钮或链接发布到 2 个页面?

php - 基于同一 while 循环内先前查询的数据进行查询

Apache SSL 设置最大片段长度

php - .htaccess 路由 PHP

javascript - 服务器生成的具有长帖子内容的 PDF angularjs

php - 如何使用 PHP 获取请求来源?

html - 如何在 HTML Bootstrap 中将 2 个 div 居中?

html - .htaccess 使用别名 url 重定向