RewriteEngine On RewriteRule ^custom index.PHP?page=value [NC,L]
如果index.PHP和.htaccess位于同一文件夹中,则可以正常工作.
我想将.htaccess文件放在根目录中,并使放在newFolder中的内容对htaccess规则作出反应.说:
.htaccess – >根级别
index.PHP – > root / newFolder级别
我试过了:
RewriteEngine On RewriteRule ^custom newFolder/index.PHP?page=value [NC,L]
完全没有反应(404):(
我想解决方案必须简单,但……
任何帮助将不胜感激.
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?页面= value执行,我在加载的newFolder目录中获取index.PHP页面.显示的页面现在如下所示:
page value: value script loaded: /newFolder/index.PHP
所以,同样地,我可以在根目录中创建任意数量的目录,并在这些目录中创建新的index.PHP文件,当导航到这些目录中的“custom”时,此.htaccess文件应该加载相应的index.PHP文件.当前的子目录.
~~~
我将在这里假装您想要动态加载页面,因此将“自定义”捕获为动态页面名称并将其转储到页面字段中(替换“value”)并将其发送到索引.当前子目录中的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中而不是硬编码目录名.我宁愿在每个子目录中放入.htaccess文件并接管那里的URL处理.
但是,如果出于某种原因你更喜欢在根目录中维护一个.htaccess文件,那么,跳出来的是规则中的重复.因此,或者,您可以使用正则表达式将子目录名称设为捕获变量,如此答案顶部所示:
RewriteEngine On RewriteRule ^(.+/)?custom $1index.PHP?page=value [NC,L]
正则表达式捕获括号替换文本“newFolder /”,并在括号内我们说,“捕获一个或多个字符后跟正斜杠”.然后,如果匹配成功,则捕获的值将替换目标中的“$1”.这也适用于root的原因是因为括号后面的问号使得parens中的正则表达式是可选的.因此,如果在“自定义”之前没有任何内容,我们仍然可以进行比赛.在这种情况下,“$1”将被替换为空字符串.