我创建了一个文档 wiki,我想使用虚拟主机的别名将其附加到我的主要站点。这样我就可以通过 website.com/documentation 访问该 wiki。我以前曾成功使用 mod_rewrite 作为别名,但我无法让这个别名工作。别名设置正确,站点可以正常工作,但没有重写规则。
我使用的是 doku wiki,但我使用什么应该很重要,因为 apache 完成了所有工作,而不是 php。我想按如下方式重写 URL。
以下重写规则是适用于 dokuwiki 的默认开箱即用规则,但它们不执行任何操作。
RewriteEngine On
RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L]
RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L]
RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L]
RewriteRule ^$ doku.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) doku.php?id=$1 [QSA,L]
RewriteRule ^index.php$ doku.php
我尝试添加我熟悉的常用规则,但这些规则都不起作用。
RewriteRule ^documentation/([^/]*)$ /documentation/doku.php?id=$1 [L]
RewriteRule ^([^/]*)$ /doku.php?id=$1 [L]
当我去http://website.com/documentation/start在浏览器中我收到 404 错误。
该服务器上未找到所请求的 URL /documentation/start。
答案1
首先,检查你的 Apache 配置中是否AllowOverride all
为网站路径启用了 .htaccess
https://httpd.apache.org/docs/2.4/en/howto/htaccess.html
那么我认为你正在寻找这个:
https://wiki.apache.org/httpd/RewriteQueryString
RewriteCond %{QUERY_STRING} ^/documentation/doku.php?id=(.*)
RewriteRule .* /documentation/%1/ [L,R=301]
RewriteRule ^/documentation/(.*)/ /documentation/doku.php?id=$1 [L]
请注意,%1
使用 而不是$1
来捕获 RewriteCond 正则表达式的结果
就像这样/documentation/doku.php?id=start
将显示/documentation/start/
并提供页面/documentation/doku.php?id=start
在您的重写规则中,您忘记了/
正则表达式开头的
RewriteRule ^/documentation/(.*)/ /documentation/doku.php?id=$1 [L]