在 apache 中删除目录的尾部斜杠

Ste*_*eve 3 mod-rewrite rewrite .htaccess rewritecond apache2

www.example.com/advice/现在有以下网址注意到网址末尾的斜杠了吗?我希望将其删除为类似www.example.com/advice. 现在,当我在浏览器中输入该 URL 时,我会被重定向到带有尾部斜杠的 URL,例如使用 curl 也是如此。现在我知道尾部斜杠被添加了,因为建议是一个实际的目录。

[steve@dev dev.www.example.com]$ curl -I  https://dev.www.example.com/advice -k
  HTTP/1.1 301 Moved Permanently
  Date: Fri, 25 Nov 2016 08:20:11 GMT
  Server: Apache/2.4.6 (CentOS)
  Location: https://dev.www.example.com/advice/
  Cache-Control: max-age=0
  Expires: Fri, 25 Nov 2016 08:20:11 GMT
  Connection: close
  Content-Type: text/html; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)
[steve@dev dev.www.example.com]$ curl -I https://dev.www.example.com/advice/ -k
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 08:21:19 GMT
Server: Apache/2.4.6 (CentOS)
X-Powered-By: PHP/5.6.27
Set-Cookie: flarum_session=mfbou2hcbvcobhncnaqlvl9bm7; Path=/; HttpOnly
X-CSRF-Token: WV69M1oi8POqOcXi6MvwKhbJQ72Tmo2WpFn3oxwq
Content-Length: 10339
Cache-Control: max-age=0
Expires: Fri, 25 Nov 2016 08:21:19 GMT
Vary: Accept-Encoding
Access-Control-Allow-Origin: *.example.com
Connection: close
Content-Type: text/html; charset=UTF-8
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的


在 .htacess 里面我试过:

DirectorySlash Off
Run Code Online (Sandbox Code Playgroud)

这导致了没有斜线的 403

[steve@dev dev.www.example.com]$ curl -I https://dev.www.example.com/advice -k
  HTTP/1.1 403 Forbidden
  Date: Fri, 25 Nov 2016 08:53:15 GMT
  Server: Apache/2.4.6 (CentOS)
  Connection: close
  Content-Type: text/html; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)

我还添加了以下重写规则,但没有任何改变

RewriteRule ^.*(advice)\/$ $1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)

更多信息


现在advice是我安装了论坛平台的地方,在我安装了 CMS 的同一目录中,如下所示

??? advice
?   ??? admin.php
?   ??? api.php
?   ??? assets
?   ??? composer.json
?   ??? composer.lock
?   ??? config.php
?   ??? CONTRIBUTING.md
?   ??? index.php <-- Forum entry point
?   ??? LICENSE
?   ??? Procfile
?   ??? readme.md
?   ??? scripts
?   ??? storage
?   ??? Vagrantfile
?   ??? vendor
??? assets
??? cms
??? codeception.yml
??? commands
??? composer.json
??? composer.lock
??? crontask
??? dropzone
??? email-helpers
??? favicon.ico
??? framework
??? gridfield-bulk-editing-tools
??? gridfieldextensions
??? index.php <-- CMS Entry point
??? kickassets
??? liveseo
??? minify
??? README.md
??? reports
??? setup.php
??? shortcodable
??? silverstripe-cache
??? siteconfig
??? _ss_environment.php
??? tests
??? themes
??? trait-loader
??? vendor
??? web.config
Run Code Online (Sandbox Code Playgroud)

阿帕奇版本 Apache/2.4.6 (CentOS)

您可以在.htaccess 此处找到建议以及此处的 cms 中的建议

如果它有帮助,CMS 是silverstripe,论坛是flarum

MrW*_*ite 5

如果删除目录上的斜杠,但仍希望返回目录索引文档(在该目录中),则需要通过内部重写索引文档来手动“修​​复”URL。(您基本上需要通过转动来重做已撤消的操作DirectorySlash Off。)

在根.htaccess文件中的其他 mod_rewrite 指令之前尝试类似以下内容:

DirectorySlash Off

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_FILENAME}/index.php -f
RewriteRule (.*) $1/index.php [L]
Run Code Online (Sandbox Code Playgroud)

对于物理目录的所有请求,不index.php以该目录中存在的斜杠结尾,然后在内部重写为index.php.

或者,您可以只附加尾部斜杠(通过内部重写),然后允许 mod_dir 向DirectoryIndex. 例如:

RewriteRule (.*) $1/ [L]
Run Code Online (Sandbox Code Playgroud)

假设您有一个DirectoryIndex集合(如果以前可以正常工作,您可能确实有)然后 mod_dir 将在内部将请求(严格来说是一个子请求)从/advice/to重写/advice/index.php。然而,这现在是一个两阶段的过程,所以你最好用 mod_rewrite 把这一切都做一遍(除非你有不同的目录索引文档)。


以上是所有目录的一般情况。您可以更具体,只检查有问题的目录/URL:

RewriteRule ^advice$ advice/index.php [L]
Run Code Online (Sandbox Code Playgroud)

如果请求是针对/advice然后内部重写的/advice/index.php- 这不会检查它是否是一个目录,这只是假设。