我正在尝试实现(使用mod_rewrite)请求检查公共文件夹中是否存在文件/目录,如果存在,则提供服务,如果不存在,则将请求路由到index.php文件。此外,如果URL中没有提供扩展名,则默认为.html。
以下是我的文件夹结构:
/.htaccess
/index.php
/public
/test.html
/test.xml
/a_folder
/index.html
/test.html
例如,这里有一些请求和响应:
任何有关此事的指示都会令人惊讶,感谢提前。
答案 0 :(得分:1)
这样的事情:(从我的WordPress .htaccess文件中大量贿赂)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)^(\.\w+) $1.html [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
$1.html
行不在我的脑海中,可能需要进行一些调整。请注意,这是一个愚蠢的检查,请求的URL以点结尾,后跟一个或多个单词字符。
答案 1 :(得分:1)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(|index\.php)$ - [L]
RewriteRule ^public/(.*)$ - [L]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [R]
</IfModule>
这应该可以解决问题。
基本上,如果它是/
或/index.php
它将不会执行任何操作,如果它是/public/whateveryouwant
它将不会执行任何操作,如果它是其他任何内容它将重写为{{1并检查它是文件还是目录。如果不是,它将重定向到/public/whateveryouwant
。
答案 2 :(得分:0)
感谢@ jxpx777和@ N1xx1经过一番杂耍之后才开始工作。
Options -Indexes
RewriteEngine On
RewriteBase /
RewriteRule ^public/(.*)$ - [L]
# Check public cache
RewriteRule ^(.*)$ public/$1
RewriteRule (.*)/$ $1/index
# Add .html if not extension provided
RewriteCond %{REQUEST_URI} !\..*$
RewriteRule ^(.*)$ $1.html
# Push through stack in not in cache
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]