【问题标题】:Treating all files as parameters with few exceptions将所有文件视为参数,几乎没有例外
【发布时间】:2023-03-12 11:13:01
【问题描述】:

更新:更改了此问题的标题以反映我想要的内容

我希望使用 .htaccess 将所有目录中的所有文件视为参数,除了 /public/ 目录及其所有子目录中的所有文件。

我尝试了很多东西,但都没有奏效。我当前的 .htaccess 文件如下所示:

DirectorySlash Off
RewriteEngine On
RewriteBase /

# remove access to .htaccess
RewriteCond %{THE_REQUEST} /\.htaccess [NC]
RewriteRule ^ - [F]

# remove access to launcher.php
RewriteCond %{THE_REQUEST} /launcher\.php [NC]
RewriteRule ^ - [F]

# enforce HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# treat existing directories as parameters
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L]    

# handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)/?$ launcher.php?url=$1 [QSA,L]

这个文件已经做了以下事情:

  • 将所有目录(无论是否存在)都视为参数
  • 禁止访问 .htaccess 和 launcher.php
  • 强制使用 HTTPS
  • 将所有请求重定向到launcher.php

请注意,我希望将所有文件视为参数,而不仅仅是禁止访问。例外情况是 /public/ 文件夹及其所有子目录中的所有文件。

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案1】:

    你可以使用这个.htaccess:

    DirectorySlash Off
    RewriteEngine On
    
    # remove access to launcher.php and .htaccess
    RewriteCond %{THE_REQUEST} /\.htaccess [NC]
    RewriteRule ^ - [F]
    
    # enforce HTTPS
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    # treat existing directories as parameters
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L]    
    
    # handle Front Controller for public/
    RewriteRule ^(public)/?$ launcher.php?url=$1 [QSA,L,NC]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(public/.*?)/?$ launcher.php?url=$1 [QSA,L,NC]
    
    # handle remaining URLs as parameter
    RewriteCond %{QUERY_STRING} !(?:^|&)url= [NC]
    RewriteRule ^((?!public/).*?)/?$ launcher.php?url=$1 [QSA,L]
    

    【讨论】:

    • 请重写你的答案,因为现在我在根目录中使用launcher.php,你可以在我的代码中看到。
    • 您在我的问题中看到的 .htaccess 位于根目录中,它是我拥有的唯一 .htaccess 文件
    • 完美,虽然我也想将launcher.php和.htaccess视为参数
    • 其实public目录下的文件是不可访问的,都是作为参数处理的
    • 做到了。我正在检查查询字符串,一切都完美输出,尽管当我输入 www.example.com/public 时,查询字符串变为 public/ 。对于其他所有内容,它只是我输入的内容,fx example.com/somedir 成为查询字符串中的 somedir。解决这个问题并不重要,但如果可能的话,我也想要一个答案:)
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2020-04-21
    相关资源
    最近更新 更多