所以我从另一个人那里购买了一个脚本(没什么好看的,让我们说只是一个自定义的CMS)这有点复杂并且使用了我不知道的框架,除了“bootstrap”,“laravel”这样的名字等等。我是知道基础的人,从中间层面知道一些事情,但又一次,只有当我看到一些奇特的解决方案时,我才会感到困惑。
就像这里 - 我从未见过基于奇怪扩展名的文件构建的页面和两个 .htaccess文件 - 一个在root中,另一个在/ public /文件夹中。尽管如此,即使文件太多,一切都运行得非常好而且速度很快。
以下是问题的描述:
因此,当浏览器加载页面(domain.com)时,它会从/ public /文件夹请求(我猜)内容,一切正常,域仍然是domain.com。问题是,domain.com/public也可以工作,我想在这个特定的地址上创建重定向,只是为了防止索引这个看起来很糟糕的domain.com/public地址,但请记住,domain.com应该还能正常工作
我在SO和其他页面上尝试过maaany解决方案,但它们导致页面崩溃(内部服务器错误)或者根本没有做任何事情。我认为其中一些可能有效,但只有当文件没有嵌入另一个子文件夹时。呃我不知道,我没有想法。你能帮我吗?
这是root的.httaccess
RewriteEngine On
RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]
RewriteRule ^((?!public/).*)$ public/$1 [L,NC]
这是public / .htaccess
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
答案 0 :(得分:0)
在我看来,你应该有什么工作,特别是根.htaccess
中的第一个条件+规则是为了做你所要求的。我会稍微打磨一下:
在/.htaccess
:
RewriteEngine On
RewriteBase /
# Fix URLs that begin with "public" subdirectory
RewriteCond %{THE_REQUEST} \s/public(?:/(\S*))?\s
RewriteRule ^ %1 [NS,NE,R=301,END]
# Internally rewrite everything else
RewriteRule ^(?!public/).* public/$0 [DPI,L]
在/public/.htaccess
:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Pretend this is the root
RewriteBase /
# Redirect trailing slashes if not a folder
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [DPI,R=301,END]
# Handle front controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?!index\.php$). index.php [DPI,END]
</IfModule>
如果您的Apache版本较旧,您可以使用L
代替END
,因为500错误,您就会知道。