我正在为网站配置.htaccess。
我想从
重写网址http://www.example.com/search/foo/bar/baz/ ...(任意数量的子目录)
到
http://www.example.com/forms/index.php?i=foo--bar--baz-- ...
另一种选择是重定向所有网址
http://www.example.com/search/foo/bar/baz/ ...
到
http://www.example.com/forms/index.php
让index.php解析uri。
我尝试了以下mod_rewrite来实现上面的第二个替代
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php
但我收到404错误。
注意:不确定是否重要,但这是在Wordpress网站上发生的。整个.htaccess是
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
任何帮助都将不胜感激。
感谢。
EDIT1:
我取得了一些进展。我在RewriteRule的末尾错过了[L]。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php [L]
作品。现在我需要检查/搜索网址。
EDIT2:
更多进展:
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^search/(.*)$ http://www.example.com/forms/index.php?i=$1 [QSA,L]
它似乎工作正常。在搜索之后传递所有内容/作为参数i。
现在我还想在地址栏中显示原始网址(不是重写的网址)。这样做的任何方式?
由于
答案 0 :(得分:1)
有什么效果
Rewrite ^(.*)$ forms/index.php?i=$1 [QSA,L]
应该工作
此处的关键点是^(.*)$
选择并捕获任何网址,?i=$1
将旧网址作为查询字符串。
QSA
使旧的查询字符串附加在其他信息传递上。你可能需要这个,你可能不需要。
答案 1 :(得分:1)
如果您收到404错误,那么您可能没有打开重写模块,或者根本没有读取.htaccess文件。
这似乎不正确:
RewriteRule !^index\.php$ /forms/index.php
重写引擎层次结构是第一个找到的规则适用,其他被跳过。因此,如果您不想重写index.php,而是重写所有其他内容,您可以简单地执行Wordpress的操作:
第一行:
RewriteRule ^index\.php$ - [L]
&lt; - 将index.php重写为“nothing”
第二行:
RewriteRule .* /index.php [L]
&lt; - 将所有内容重写为index.php
因此,当请求是index.php时,Apache的行为如下:它检查第一行......“哇!匹配!所以让我们把它重写为空并加载这个文件......其他规则存档?哦,好吧。 ..我没有时间阅读它们!“
当请求不是index.php时,Apache检查第一行......“哦,好吧......不匹配......该死的......我必须阅读其他行”。检查第二行......“是的!它匹配!我不需要阅读任何其他内容,phiew!”