.htaccess 仅在一个 link 上导致 403

.htaccess is causing 403 on one link only

有点奇怪,我觉得必须回答,但我似乎找不到。

我在自定义 PHP 站点上的 .htaccess 文件中有以下内容 (不是 WORDPRESS):

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(contact|gallery|links)$ .php [L]

我不明白为什么“画廊”只给我 403。

example.com/links
example.com/contact

两者都按预期工作并转到所需的页面。不过

example.com/gallery

重定向到

example.com/gallery/

并抛出 403 禁止错误

gallery.php是一个页面,可以从同一个页面访问URL

gallery.php 上没有任何内容可以重定向或检查查询字符串或比较 URI。看不懂。

真的对 .htaccess 的东西视而不见(总是有),所以非常感谢任何帮助。我做错了什么?!

此外,在 https://htaccess.madewithlove.com/ 上测试它,它说我的工作是正确的,所以真的不明白它发现了什么不正确。为什么它认为画廊是一个子文件夹,而不是 URL?

我刚刚意识到,我确实有一个图库文件夹,所以如果有人能告诉我如何使用 htaccess 访问页面而不是文件夹,我将不胜感激!如果有帮助,图库文件夹中有一个 .htaccess 以防止直接访问图像:

Options -Indexes
Options -ExecCGI 
# AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi

<Files ^(*.jpeg|*.jpg)>
order deny,allow
deny from all
</Files>
<FilesMatch "\.(jpe?g)$">
order allow,deny
allow from all
</FilesMatch>

他们会不会有冲突?

由于 gallery 是物理目录,您需要设置 DirectorySlash Off 以防止 mod_dir 通过 301 外部重定向附加尾部斜杠。 (此重定向会被浏览器永久缓存,因此您需要在继续之前清除浏览器缓存。)

但是请注意,当禁用 DirectorySlash 时,您还必须确保 Options -Indexes 也被设置为防止 mod_autoindex 在省略尾部斜杠时生成目录列表一个目录,因为该目录中的 DirectoryIndex 文档将不再阻止生成目录列表。见 security warning under the DirectorySlash directive in the Apache Docs.

可能还需要设置RewriteOptions AllowNoSlash以允许mod_rewrite匹配没有尾部斜杠的目录。

然后您需要修改现有规则...

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(contact|gallery|links)$ .php [L]

删除前两个 RewriteCond 指令。它们不是必需的,因为您想要重写 3 个特定的 URL。如果任何条件失败,则不会发生重写。

如果 contactgallerylinks 碰巧以物理文件(极不可能)或目录(gallery 似乎是一个目录)的形式存在,则重写不会发生。


总结

DirectorySlash Off

Options +FollowSymlinks -Indexes

RewriteEngine On
RewriteOptions AllowNoSlash

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(contact|gallery|links)$ .php [L]