我正在试图找出让我的网站上的所有内容都指向index.php的最佳方式,除了所有位于/ public的图片/ css / javascript。
这是我在.htaccess中尝试过的两个部分方法,但是想知道是否有更好的方法或方法可以改进其中任何一个。
另外,我不确定哪一个在服务器上会更好(开销更少)。
RewriteEngine on
RewriteBase /subfolder/
RewriteRule !\.(js|ico|txt|gif|jpg|png|css|pdf)$ index.php
RewriteRule ^.*/public/(.*)$ /subfolder/public/$1
#RewriteBase /subfolder
#RewriteCond %{REQUEST_URI} ^(?!/public/).+ [NC]
#RewriteRule !\.(js|ico|txt|gif|jpg|png|css|pdf)$ index.php [L]
任何人都有关于如何以最佳方式做到这一点的任何建议?
答案 0 :(得分:1)
以下是我为自己的框架所做的事情(“STATIC
”环境变量的计算非常复杂,所以我删除了现在可能过于复杂的“硬”部分:
# if the site is static (i.e. xx.static.mydomain.com)
RewriteCond %{ENV:STATIC} 1
# Try to assign the extension into an EXT variable:
RewriteRule (.*)(\.(css|js|htc|pdf|jpg|jpeg|gif|png|ico)){1}$ $1$2 [NC,QSA,E=EXT:$3]
# (!) if it's an image...
RewriteCond %{ENV:EXT} (jpg|jpeg|gif|png|ico) [NC]
# ...no matter the extension, change it to 'img' :
RewriteRule (.*) - [QSA,E=EXT:img]
# if it's static...
RewriteCond %{ENV:STATIC} 1
# ...and its extension is not empty:
RewriteCond %{ENV:EXT} !^$
# ...and the filename exists in the good dir, i.e. :
# /web/htdocs/mydomain/css/xx.css
# /web/htdocs/mydomain/js/yy.js
# /web/htdocs/mydomain/img/aa.jpg
# /web/htdocs/mydomain/img/bb.gif
# and so on...
RewriteCond %{DOCUMENT_ROOT}/%{ENV:EXT}%{REQUEST_FILENAME} -f
# file exists => override filename and stop:
RewriteRule ^(.+) %{DOCUMENT_ROOT}/%{ENV:EXT}%{REQUEST_FILENAME} [QSA,L]
这样你可以做一个非常好的组织,当谈到获得一个“静态”文件时,如果你把规则放在最开头,那么它们将被正确过滤,并且永远不会被重定向到{{1 }}
因此,我的目录结构看起来像这样(我觉得这很干净),你可以轻松地做同样的事情:
index.php
答案 1 :(得分:0)
如果所有非资源请求都是非常“虚拟”的网址,没有相应的文件,那么最好的方法是
#only if it is a request for a file that does not exist
#i.e exlcude resources css etc
RewriteCond %{REQUEST_FILENAME} !-f
#send it to index.php
RewriteRule .* index.php [L]
#send image requests to subfolder public
#if you can modify original resource urls to point to subfolder, this will not be necessary
RewriteRule /public/(.*)$ /subfolder/public/$1 [L]