我有index.php,它通过$_SERVER[‘REQUEST_URI’]
变量读取完整路径。我的任务是当用户输入:www.domain/resource/777
时,使用路径index.php
重定向到/resource/777
并解析$_SERVER[‘REQUEST_URI’]
以执行某些逻辑。但我也有真实的文件和文件夹,如:
当我尝试这个配置时:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L]
客户端无法获取所有css和etc文件。如何在Apache中编写正确的规则来实现这个目标?
答案 0 :(得分:10)
如果您使用的是Apache 2.2.16或更高版本,则可以完全用一个指令替换重写规则:
++x;
--y;
z = x - (y*b)/a;
请参阅https://httpd.apache.org/docs/2.2/mod/mod_dir.html#fallbackresource
基本上,如果请求导致错误404,则将使用回退资源uri来处理请求,正确填充FallbackResource /index.php
变量。
答案 1 :(得分:2)
你的规则没问题。 css / js / image的问题在于你使用相对路径来包含它们。
您可以在页面HTML的<head>
部分下方添加:
<base href="/" />
以便从该基本网址解析每个相对网址,而不是从当前网页的网址解析。
还要在.htaccess中保留此规则:
DirectoryIndex index.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[^.]+$ index.php [L]
答案 2 :(得分:1)
根据the documentation REQUEST_FILENAME
,如果服务器已经确定了路径,则仅评估文件的完整本地文件系统路径。
简而言之,这意味着如果条件位于.htaccess
文件内或httpd.conf中的<Directory>
部分内,则该条件将起作用,但如果它位于{{<VirtualHost>
内部则不行1}}。在后一种情况下,您只需将其包装在<Directory>
标记中即可使其正常工作。
<VirtualHost *:80>
# ... some other config ...
<Directory /path/to/your/site>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L]
</Directory>
</VirtualHost>
答案 3 :(得分:0)
您可以在htaccess文件中设置错误文档,以便使用index.php然后请求非现有文件:
ErrorDocument 404 /index.php
答案 4 :(得分:0)
现在只有这对我有帮助:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/src/
RewriteCond %{REQUEST_URI} !^/assets/
RewriteCond %{REQUEST_URI} !^/resource/
RewriteCond %{REQUEST_URI} !^/data.json
RewriteRule ^(.*)$ /index.php [L]