如何制定相对于 .htaccess 文件的重写规则

Ken*_*ins 5 mod-rewrite apache-2.2

目前我有一个这样的 .htaccess 文件。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/(always|rewrite|these|dirs)/ [NC]

RewriteRule ^(.*)$ router.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)

当站点文件位于网络服务器的 document_root 中(即domain.com/abc.php-> <DOCUMENT_ROOT>/abc.php)时,它可以创建。但是在我们当前的设置(不可更改)中,这并不能保证。我们有时可以在 .htaccess 文件的文档根目录和文件夹之间有任意文件夹(即domain.com/something/abc.php-> <DOCUMENT_ROOT>/something/abc.php)。唯一的问题是第二个RewriteCond不再有效。无论如何,是否可以通过相对于.htaccess文件的路径动态检查访问的路径。

例如:

如果我有一个网站,文件domain.com/prefix/的目录在哪里.htaccess

NOT FORCED TO REWRITE -> domain.com/prefix/index.php
FORCED TO REWRITE -> domain.com/prefix/rewrite/index.php
Run Code Online (Sandbox Code Playgroud)

如果我有一个网站,文件domain.com/的目录在哪里.htaccess

NOT FORCED TO REWRITE -> domain.com/index.php
FORCED TO REWRITE -> domain.com/rewrite/index.php
Run Code Online (Sandbox Code Playgroud)

Oli*_*ons 2

有一个解决方案,但并不简单。

\n\n

使用RewriteMap

\n\n

我会这样做:

\n\n

创建RewriteMap文件。浏览此处获取更多信息这是一个非常简单的文本文件,其中:首先是不带 \'/\'的错误 URL ,然后是一个空格(至少),然后是正确的 url,如下所示:

\n\n
ok\xe2\x80\x8b /folder1/\nok /folder2/\nok /folder3/\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后是代码:

\n\n
RewriteMap myfoldermap \\\n  dbm:/web/htdocs/yourwebsite.com/rewriterules/myfoldermap.map\n\nRewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)\n# Now in \'%1\' there\'s the name of the folder\n# Don\'t touch the URL but...\n# ...check if it exists in the map file\nRewriteRule (.*) - [QSA,E=FOLDERMAP:${myfoldermap:%1|notfound}]\n\n# if the environment is neither empty or not found...\nRewriteCond %{E:FOLDERMAP} !^(notfound|)$\n# this means we found something...\n# => apply the RewriteRule\nRewriteRule ^(.*)$ router.php [L,QSA]\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果它不起作用:阅读我通常的“两个提示”,并在您的问题中添加重写日志。

\n\n

两个提示:

\n\n

如果您不在托管环境中(=如果它是您自己的服务器并且您可以修改虚拟主机,而不仅仅是文件.htaccess),请尝试使用该RewriteLog指令:它可以帮助您追踪此类问题:

\n\n
# Trace:\n# (!) file gets big quickly, remove in prod environments:\nRewriteLog "/web/logs/mywebsite.rewrite.log"\nRewriteLogLevel 9\nRewriteEngine On\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

我最喜欢的检查正则表达式的工具:

\n\n

http://www.quanetic.com/Regex(不要忘记选择 ereg(POSIX) 而不是 preg(PCRE)!)

\n