友好的URL和htaccess级别

时间:2014-12-31 16:52:40

标签: php apache .htaccess mod-rewrite

我有这个.htaccess

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

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

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

.htaccess - >根级别 index.php - > root / newFolder级别

我确实尝试过:

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

根本没有反应(404):(

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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:6)

让我们确保我们在同一页面上。 ;)在我的服务器根目录中,我有一个 .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时:将正则表达式匹配模式与字符串&#34; custom&#34;进行比较,成功匹配,以便目标index.php?page=value执行,我在加载的根目录中获取index.php页面。显示的页面如下所示:

page value: value
script loaded: /index.php

接下来,我在服务器根目录中创建一个名为&#34; newFolder&#34; 的新目录,并将 index.php 文件复制到新创建的目录中。< / p>

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

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

同样,我可以在根目录中创建任意数量的目录,并在这些目录中创建新的index.php文件,并在导航到&#34; custom&#34;在这些目录中,此 .htaccess 文件应该在当前子目录中加载相应的index.php文件。

~~~

我会在这里走出困境并假设您想要动态加载页面,因此捕获&#34; custom&#34;作为动态页面名称并将其转储到页面字段中(替换&#34;值&#34;)并将其发送到当前子目录中的index.php文件。

RewriteEngine On

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

如上所述,括号捕获动态文本并将其转储到美元符号编号为的目标字符串中。因此,在第一组括号中捕获的文本将替换&#34; $ 1&#34;并且在第二组中捕获的文本替换了&#34; $ 2&#34;。我还添加了RewriteCond语句以防止此规则被双重覆盖。 :)如果我没有执行此规则,那么&#34; custom&#34;调用AND重定向到index.php。

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

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

~~~

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

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

但是在将浏览器导航到子目录时它不起作用。阅读完评论后,您会发现下一位对子目录有效,特别是&#34; newFolder&#34;:

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 中硬编码目录名,而不是在每个子目录中放置 .htaccess 文件,并在那里接管URL处理。

但是,无论出于何种原因,你更愿意在根目录中维护一个 .htaccess 文件,那么,跳出来的是规则中的重复。因此,或者,您可以使用正则表达式将子目录名称设为捕获变量,如此答案顶部所示:

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

正则表达式捕获括号替换文本&#34; newFolder /&#34;,并在括号内我们说,&#34;捕获一个或多个字符后跟正斜杠&#34;。然后,如果成功匹配,则捕获的值将替换&#34; $ 1&#34;在目标中。这也适用于root的原因是因为括号后面的问号使得parens中的正则表达式是可选的。所以,如果之前没有任何事情,那么&#34; custom&#34;我们仍然有利于比赛。在那种情况下,&#34; $ 1&#34;被空字符串替换。

答案 1 :(得分:4)

尝试使用此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/ 请求的网址字符串以folder/clients/
  3. 开头
  4. (\w+) 捕获随后的任何字母并将其存储在$1
  5. /? 网址末尾的可选反斜杠
  6. $ 结束表达
  7. rewriterule的第二部分:

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