【问题标题】:Remove extension and force trailing slash to non trailing slash at end删除扩展名并将尾部斜杠强制为末尾的非尾部斜杠
【发布时间】:2018-02-18 18:08:01
【问题描述】:

嗨,我有一个网站,我在其中使用某些规则使 URL SEO 友好。这是代码:

Options +FollowSymLinks    
Options -Multiviews    
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} libwww-perl.* 
RewriteRule .* ? [F,L]

RewriteRule ^([a-zA-Z0-9_-\s]+)/([a-zA-Z0-9_-\s]+)/([0-9]+)/([a-zA-Z0-9_-\s]+)$ /page1.php?var1=$1&var2=$2&var3=$3&var4=$4 [L,QSA]
RewriteRule ^([a-zA-Z0-9_-\s]+)/([a-zA-Z0-9_-\s]+)/([a-zA-Z0-9_-\s]+)$ /page2.php?var1=$1&var2=$2&var3=$3 [L]
RewriteRule ^([a-zA-Z0-9_-\s]+)/([a-zA-Z0-9_-\s]+)$ /page2.php?var1=$1&var2=$2 [L,QSA]
RewriteRule ^([a-zA-Z0-9_-\s]+)$ /page2.php?var1=$1 [L,QSA]

# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteRule ^(.+?)/$ /$1 [R=301,L]

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]

ErrorDocument 404 /404.php

在某些情况下它可以正常工作,但在某些情况下会显示一些错误。

我遇到的错误:

1) 假设我有一个 page3.php,当我访问 www.example.com/page3.php 时,它会显示 page3 的内容而不删除扩展名来自 URL 但当我输入 www.example.com/page3 时,它会将 page3 作为变量并显示 page2 的内容,因为我已经描述了重写规则page2 的单个变量。

2) 如果我将我的 URL 写为 www.example.com/var1/ 它会将 URL 重写为 www.example.com/var1/.php 但如果我将其写为 www.example.com/var1/var2/ 它工作正常,即删除斜杠。

正如在错误 1 ​​中提到的,首先我想将我的 .php 页面重定向到 without php,其次如果在我的 URL www.example.com/page3 page3 是我的根目录中的一个文件,它显示 page3 的内容,如果 page3 不是我的根目录中的文件,那么它应该将 page3 作为一个变量,它应该像上面提到的重写规则一样工作 em>。

对于错误 2,我想从 URL 中删除尾部斜杠,无论它有 1 个变量还是 2 个或 3 个或 4 个变量。

请帮帮我...提前谢谢...

注意:我在 HTTPS 而不是 HTTP 上运行我的网站。

【问题讨论】:

    标签: php apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:
    1. 在重写之前有重定向规则。
    2. 在您的 .htaccess 中添加 .php 扩展名之前,请检查是否存在相应的 .php 文件。

    像这样:

    ErrorDocument 404 /404.php
    Options +FollowSymLinks -Multiviews
    RewriteEngine on
    
    RewriteCond %{HTTP_USER_AGENT} libwww-perl.* 
    RewriteRule ^ - [F,L]
    
    # remove trailing slash
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)/$ /$1 [NE,R=301,L]
    
    # skip all files and directories from rules below
    RewriteCond %{SCRIPT_FILENAME} -d [OR]
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule ^ - [L]
    
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^([^.]+?)/?$ $1.php [NC,L]
    
    RewriteRule ^([\w-]+)/([\w-]+)/([0-9]+)/([\w-]+)$ page1.php?var1=$1&var2=$2&var3=$3&var4=$4 [L,QSA]
    
    RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)$ page2.php?var1=$1&var2=$2&var3=$3 [L,QSA]
    
    RewriteRule ^([\w-]+)/([\w-]+)$ page2.php?var1=$1&var2=$2 [L,QSA]
    
    RewriteRule ^([\w-]+)$ page2.php?var1=$1 [L,QSA]
    

    完全清除浏览器缓存后进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 2015-01-15
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多