我可以在.htaccess中做的是将example.com/s1/s2/s3
作为php中$_REQUEST
数组中的3个元素。我如何翻译它以正确的工作在conf文件?
.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [NC,L,QSA]
conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
DocumentRoot "/home/...path.../public"
ServerName example.com
Alias /lib /home/...path.../otherlib/
<Directory />
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/lib/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [NC,L,QSA]
</VirtualHost>
</IfModule>
1条答案
按热度按时间b1payxdu1#
当在 virtualhost 上下文中使用时,mod_rewrite的处理要早得多,在请求Map到文件系统之前。因此,
REQUEST_FILENAME
还不包含请求的URLMap到的完整文件系统路径,它只包含根相对URL(与REQUEST_URI
相同)。所以,这两个“否定”的条件总是成功的。(所以你所有的静态资产也将被重写到前端控制器中。)你需要要么,使用前瞻,例如。
%{LA-U:REQUEST_FILENAME}
或从DOCUMENT_ROOT
和REQUEST_URI
服务器变量构造文件名,这在任何一种上下文中都有效。举例来说:我还简化了
RewriteRule
模式,因为这里不需要捕获URL路径,也不需要匹配根目录。NC
和QSA
标志也是不必要的。我可以在
.htaccess
中做的是将example.com/s1/s2/s3
作为php中$_REQUEST
数组中的3个元素。但是,上面没有做到这一点。使用上述指令,您可以从PHP中的单个
$_SERVER['REQUEST_URI']
超全局元素访问整个URL,然后需要解析/分解以提取s1
,s2
和s3
。如果你特别想要
$_REQUEST
数组中的3个元素,那么你需要将RewriteRule
指令改为如下所示:但这只匹配
/foo/bar/baz
的URL。像/foo/bar
这样的双路径段URL将不匹配。