所以我一直在研究一些不能按预期工作的重写规则。 这些是我想重写的一些示例请求:
/ -> /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]
我不完全确定所有这些指令,我注意到,目前有一些缺陷。
/Files/Bad/Path.pdf
,将用户转发到/?page=Home
,该文件应该被redirect到/
, /Home
或显示/index.php?page=FileNotFound
的内容/index.php?page=FileNotFound
,根据(default)
的规则,根本不改变URL或者redirect到/FileNotFound
。 我不确定哪种解决scheme可能是最适合的。 /
。 在这两种情况下,我觉得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]
确保在测试之前清除浏览器缓存。