意外的行为与自定义.htaccess重写规则

所以我一直在研究一些不能按预期工作的重写规则。 这些是我想重写的一些示例请求:

/ -> /index.php?page=Home /Home -> /index.php?page=Home /Teaching/Foo -> /index.php?page=Teaching&id=Foo /Teaching/Bar -> /index.php?page=Teaching&id=Bar /Download/ue8 -> /index.php?action=Download&id=ue8 /Download/24a -> /index.php?action=Download&id=24a (default) -> /index.php?page=Home ** OR ALTERNATIVELY ** (default) -> /index.php?page=FileNotFound (and maybe rewrite the visible URL to /FileNotFound) 

我主要希望隐藏尽可能多的url,并防止目录列表和直接访问我的文件位于特定的文件夹,只允许通过/Download/FileId访问可下载的文件,同时我有不同的讲座通常页面访问通过/Teaching/SomeLecture

到目前为止,我一直在使用这个片段的/Home/Teaching东西:

 RewriteEngine On RewriteBase / # Redirect Trailing Slashes RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^Teaching/([A-Za-z0-9]*)$ index.php?page=Teaching&id=$1 [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^Home$ index.php?page=Home [L] RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s(.*)/index\.php [NC] RewriteRule ^ %1 [R=301,L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,R=301] 

我不完全确定所有这些指令,我注意到,目前有一些缺陷。

  1. 尝试访问不存在的文件,例如/Files/Bad/Path.pdf ,将用户转发到/?page=Home ,该文件应该被redirect//Home或显示/index.php?page=FileNotFound的内容/index.php?page=FileNotFound ,根据(default)的规则,根本不改变URL或者redirect到/FileNotFound 。 我不确定哪种解决scheme可能是最适合的。
  2. 试图访问一些确实存在的文件夹会导致无限的redirect循环,而不存在的文件夹显然会redirect到/ 。 在这两种情况下,我觉得redirect到/FileNotFound正确的?

你能在这种情况下制定出一套适合我需要的规则吗?

您的.htaccess中有许多冗余指令。 把所有的.htaccess替换成这个:

 # Turn off mod_spelling <Ifmodulee mod_speling.c> CheckSpelling off CheckCaseOnly off </Ifmodulee> Options -MultiViews RewriteEngine On RewriteBase / # block direct access to file and directories in these directories RewriteCond %{REQUEST_URI} !\.(?:jpe?g|gif|bmp|png|tiff|css|js)$ [NC] RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^(Templates|Files) - [NC,F] # remove index.php RewriteCond %{THE_REQUEST} /index\.php [NC] RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE] # Redirect Trailing Slashes RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(Download|Teaching)/([\w-]+)/?$ index.php?page=$1&id=$2 [L,QSA,NC] RewriteRule ^(Home)?/?$ index.php?page=Home [L,NC,QSA] 

确保在测试之前清除浏览器缓存。