Ser*_*gio 7 php apache .htaccess mod-rewrite
我有这个.htaccess
RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]
Run Code Online (Sandbox Code Playgroud)
如果index.php和.htaccess位于同一文件夹中,则可以正常工作.
我想将.htaccess文件放在根目录中,并使放在newFolder中的内容对htaccess规则做出反应.说:
.htaccess - > root level
index.php - > root/newFolder级别
我试过了:
RewriteEngine On
RewriteRule ^custom newFolder/index.php?page=value [NC,L]
Run Code Online (Sandbox Code Playgroud)
完全没有反应(404):(
我想解决方案必须简单,但......
任何帮助将不胜感激.
让我们确保我们在同一页面上.;)在我的服务器根目录中,我有一个.htaccess文件,在该文件中我有:
RewriteEngine On
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L]
Run Code Online (Sandbox Code Playgroud)
RewriteRule有三个组件:匹配模式,目标和标志列表.匹配模式可以包含纯文本或正则表达式.目标可以包含纯文本或带有在正则表达式匹配模式中捕获的混合变量的文本.匹配模式和目标都相对于.htaccess文件所在的目录.
将匹配模式与当前目录之后的URL中的文本进行比较.如果匹配成功,则从.htaccess文件所在的目录中调用目标.如果在匹配模式中捕获信息,则首先在目标中插入目标中的变量.
在此示例中,.htaccess文件位于服务器根目录中,因此匹配模式与URL文本进行比较:http://localhost/
为了测试它,这是我放在index.php文件中的PHP代码:
<?php
echo 'page value: ' .$_GET['page'] . '<br>';
echo 'script loaded: ' . $_SERVER['PHP_SELF'];
?>
Run Code Online (Sandbox Code Playgroud)
当我http://localhost/custom
在浏览器中导航时:将正则表达式匹配模式与字符串"custom"进行比较,成功匹配以便index.php?page=value
执行目标,并在加载的根目录中获取index.php页面.显示的页面如下所示:
page value: value
script loaded: /index.php
Run Code Online (Sandbox Code Playgroud)
接下来,我在服务器根目录中创建一个名为"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
Run Code Online (Sandbox Code Playgroud)
同样,我可以在根目录中创建任意数量的目录,并在这些目录中创建新的index.php文件,当导航到这些目录中的"custom"时,此.htaccess文件应该加载相应的index.php文件.当前的子目录.
~~~
我将在这里假装您想要动态加载页面,因此将"自定义"捕获为动态页面名称并将其转储到页面字段中(替换"值")并将其发送到索引.当前子目录中的php文件.
RewriteEngine On
RewriteCond %{REQUEST_URI} !index\.php
RewriteRule ^(.+/)?(.+)$ $1index.php?page=$2 [NC,L]
Run Code Online (Sandbox Code Playgroud)
如上所述,括号捕获动态文本并将其转储到美元符号数字所在的目标字符串中.因此,在第一组括号中捕获的文本将替换"$ 1",而在第二组中捕获的文本将替换为"$ 2".我还添加了RewriteCond
声明以防止此规则双重浸渍.:)如果我没有为"自定义"调用和重定向到index.php执行此规则.
所以现在当我导航到时http://localhost/newFolder/whoopdeedoo
,将正则表达式匹配模式与"newFolder/whoopdeedoo"进行比较,成功匹配,目标newFolder/index.php?page=whoopdeedoo
被执行,我得到:
page value: whoopdeedoo
script loaded: /newFolder/index.php
Run Code Online (Sandbox Code Playgroud)
~~~
有倦怠的风险,这里有一些背景信息.您提到这在根目录中有效:
RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]
Run Code Online (Sandbox Code Playgroud)
但是在将浏览器导航到子目录时它不起作用.阅读完评论之后,您会发现下一位对子目录有效,特别是"newFolder":
RewriteEngine On
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L]
Run Code Online (Sandbox Code Playgroud)
但现在它不再适用于根目录.所以你可以简单地包括两个:
RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L]
Run Code Online (Sandbox Code Playgroud)
然而,这里有一些东西突然出现在我面前.一个是在我的根.htaccess中而不是硬编码目录名.我宁愿在每个子目录中放置.htaccess文件并接管那里的URL处理.
但是,如果由于某种原因你更喜欢在根目录中维护一个.htaccess文件,那么,跳出来的是规则中的重复.因此,或者,您可以使用正则表达式将子目录名称设置为捕获的变量,如此答案顶部所示:
RewriteEngine On
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L]
Run Code Online (Sandbox Code Playgroud)
正则表达式捕获括号替换文本"newFolder /",并在括号内我们说,"捕获一个或多个字符后跟正斜杠".然后,如果匹配成功,则捕获的值将替换目标中的"$ 1".这也适用于root的原因是因为括号后面的问号使得parens中的正则表达式是可选的.因此,如果在"自定义"之前没有任何内容,我们仍然可以进行比赛.在这种情况下,"$ 1"将替换为空字符串.
归档时间: |
|
查看次数: |
276 次 |
最近记录: |