0

我想要实现的(使用 mod_rewrite)是根据请求检查公用文件夹中是否存在文件/目录,如果存在,则提供它,如果不存在,则将请求路由到 index.php 文件。此外,如果 URL 中没有提供扩展名,则默认为 .html。

下面是我的文件夹结构:

/.htaccess
/index.php
/public
    /test.html
    /test.xml
    /a_folder
        /index.html
        /test.html

例如,这里有一些请求和响应:

  • example.com/test.xml >>> /public/test.xml
  • example.com/a_folder/ >>> /public/a_folder/index.html
  • example.com/a_folder/test >>> /public/a_folder/test.html
  • example.com/not_in_public >>> /index.php

任何关于这方面的建议都会很棒,在此先感谢。

4

3 回答 3

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 以点结尾,后跟一个或多个单词字符。

于 2013-01-23T13:46:43.503 回答
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不会做任何事情,如果它是其他任何东西,它将重写/public/whateveryouwant并检查它是文件还是目录。如果不是,它将重定向到index.php.

于 2013-01-23T13:53:53.420 回答
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]
于 2013-01-23T15:23:24.160 回答