我已经有两个现在可以正常工作的重写规则,但必须添加更多代码才能完美工作。
我在 mydomain.com 上托管了一个网站,并且所有 subdom.mydomain.com 都被重写为 mydomain.com/subs/subdom 。如果访问的文件不存在,我的 CMS 必须处理请求,重写是这样完成的:
RewriteCond $1 !^subs/
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ subs/%1/index.php?page=$1 [L]
我的 CMS 像往常一样处理解析的下一部分。问题是如果一个文件真的存在,我需要在不通过我的 CMS 的情况下链接到它,我设法这样做:
RewriteCond $1 !^subs/
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ subs/%1/$1 [L]
到目前为止,它似乎很有魅力。现在我很挑剔,我需要将默认文件存储在 subs/default/中。如果该文件存在于子域文件夹中,我们应该获取该文件,否则,我们需要从默认子域中获取该文件。如果该文件在任何地方都不存在,我们应该使用来自当前子域的 404 页面,除非没有。
我希望它描述得足够好。感谢您的时间!
最佳答案
问题是你需要提供绝对文件系统路径才能得到-f
和 -d
在职的。如果您在文档根目录中,则可以使用以下规则:
RewriteCond $1 !^subs/
RewriteCond %{DOCUMENT_ROOT}/subs/default/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/subs/default/$1 -d
RewriteRule ^(.*)$ subs/default/$1 [L]
但是如果你在其他地方,就很难获得正确的路径前缀。
关于.htaccess - mod_rewrite 如果文件存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770435/