.htaccess SilverStripe 4 -删除URL末尾的斜杠

z9gpfhce  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(181)

我已经尝试了一段时间来删除斜杠在网址链接结束,但它不工作。我搜索了很多例子,但没有一个解决我的问题。
我正在使用Silverstripe 4,目前运行在本地服务器上。出于SEO的原因,我必须删除斜线。

我目前的网址是:

www.example.com/
 
// Need to be like below 

www.example.com

我尝试通过htaccess

stackoveflow question中的示例
我在/public/.htaccess中输入了

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R] # <- for test, for prod use [L,R=301]

当我访问主页的时候,斜杠在最后。

我尝试通过SiteTree中的代码****

public function Link($action = null)
 {
   return rtrim(parent::Link($action), '/');
 }

以上代码删除所有页面结尾处的斜线,但主页上的斜线仍然存在。

www.example.com/about-us (here removed)
www.exaple.com/ (here exists)

并通过配置文件尝试

Director::config()->set('alternate_base_url', rtrim(Environment::getEnv('SS_BASE_URL'), '/'));

但同样斜杠存在于主页上的url的末尾。
有人有解决这个问题的办法吗?谢谢!

这是我完整的htaccess文件

<IfModule mod_rewrite.c>

    # Turn off index.php handling requests to the homepage fixes issue in apache >=2.4
    <IfModule mod_dir.c>
        DirectoryIndex disabled
        DirectorySlash On
    </IfModule>

    SetEnv HTTP_MOD_REWRITE On
    RewriteEngine On

    # Enable HTTP Basic authentication workaround for PHP running in CGI mode
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Deny access to potentially sensitive files and folders
    RewriteRule ^vendor(/|$) - [F,L,NC]
    RewriteRule ^\.env - [F,L,NC]
    RewriteRule silverstripe-cache(/|$) - [F,L,NC]
    RewriteRule composer\.(json|lock) - [F,L,NC]
    RewriteRule (error|silverstripe|debug)\.log - [F,L,NC]

    # Process through SilverStripe if no file with the requested name exists.
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .* index.php

    # REMOVE SLASH AT THE END OF THE URL

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R] # <- for test, for prod use [L,R=301]

</IfModule>
1cosmwyk

1cosmwyk1#

www.example.com/
 
// Need to be like below 

www.example.com

您正在尝试删除URL路径的 start 处的斜杠,该斜杠紧跟在主机名之后。
URL路径的开头总是有一个斜杠,即使你在浏览器的地址栏中并不总是看到它。这是形成有效HTTP请求所必需的。
无论您请求www.example.com(无斜杠)还是www.example.com/(有斜杠),用户代理/浏览器实际上向服务器发出完全相同的请求,即www.example.com/。如果您查看HTTP请求头的第一行,您将看到两种情况下的内容如下:

GET / HTTP/1.1

请注意第一个斜线-表示URL路径。此处的 nothing 无效。
这与删除URL路径末尾的斜杠不同,例如www.example.com/about-us/www.example.com/about-us。在这种情况下,尾部斜杠只是另一个字符。(尽管当URL路径Map到物理目录时自然会有复杂性,因为mod_dir(默认情况下)总是在这种情况下附加尾部斜杠。
另请参阅my answer以了解Webmasters Stack上的以下问题的详细信息:

进一步参考:

  • https://www.rfc-editor.org/rfc/rfc2616#section-5.1.2

我尝试通过htaccess
试图删除URL路径开头的斜线将导致重定向循环,因为用户代理每次都会 * 更正 * 请求。要使请求到达您的服务器,URL路径的开头(即主机名之后)必须有斜线。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R]

主页,即文档根目录,是一个 * 目录 *,因此 * 条件 * 失败,不处理规则。
但是 pattern^(.*)/$只会成功匹配非空的URL路径,而/$1自然会使用斜杠前缀进行重定向。要省略斜杠,您需要执行以下操作:

# DON'T DO THIS
RewriteRule ^$ https://www.example.com [R,L]

但这是 * 无意义的 *,并将导致重定向循环,原因如上所述。

相关问题