【问题标题】:404 redirect works but changes rewritten URL path in browser to full URL path404 重定向有效,但将浏览器中重写的 URL 路径更改为完整的 URL 路径
【发布时间】:2013-07-08 11:53:28
【问题描述】:

我使用以下 URL 重写方案:

example.com/about/
example.com/this/is/a/page/

前往:

example.com/pages/about/about.php
example.com/pages/this/is/a/page/page.php

它工作正常,但是在出现 404 错误时,当输入 example.com/badpage/ 时会显示 404 页面,但会将 URL 字符串更改为 example.com/pages/badpage/badpage.php

即使出现 404 错误,如何保持 URL 不变?

(从下面的代码可以看出,htaccess 还在请求的 URL 末尾添加了“/”)


htaccesss 代码:

DirectoryIndex /pages/index/index.php
ErrorDocument 404 /pages/error/404.php

RewriteEngine On

#Removes the www from domain for SEO
RewriteCond %{HTTP_HOST} ^www\.portal\.example\.com$ [NC]
RewriteRule ^(.*)$ http://portal.example.com/$1 [L,R=301]

# Don't fix direct file links
RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://portal.example.com/$1/ [L,R=301]

RewriteRule     ^([A-Za-z0-9_-]+)/?$    pages/$1/$1.php    [NC,L]
RewriteRule     ^([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/?$    pages/$1/$2/$2.php    [NC,L]
RewriteRule     ^([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/?$    pages/$1/$2/$3/$3.php    [NC,L]
RewriteRule     ^([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/?$    pages/$1/$2/$3/$4/$4.php    [NC,L]

【问题讨论】:

    标签: .htaccess url url-rewriting http-status-code-404


    【解决方案1】:

    您需要在每次重写之前添加条件,以确保您不会盲目地重写到不存在的文件中。主要是最后的4条规则需要具备一些条件:

    RewriteCond %{REQUEST_URI} ^/([A-Za-z0-9_-]+)/?$
    RewriteCond %{DOCUMENT_ROOT}/pages/%1/%1.php -f
    RewriteRule ^ pages/%1/%1.php [NC,L]
    

    第一个条件创建一个使用%1 反向引用的分组。第二个条件创建一个您尝试重写的路径,并使用-f 检查该文件是否存在。其他人也一样:

    RewriteCond %{REQUEST_URI} ^/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/?$
    RewriteCond %{DOCUMENT_ROOT}/pages/%1/%2/%2.php -f
    RewriteRule ^ pages/%1/%2/%2.php [NC,L]
    
    RewriteCond %{REQUEST_URI} ^/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/?$
    RewriteCond %{DOCUMENT_ROOT}/pages/%1/%2/%3/%3.php -f
    RewriteRule ^ pages/%1/%2/%3/%3.php [NC,L]
    
    RewriteCond %{REQUEST_URI} ^/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/([A-Za-z0-9_-]+)/?$
    RewriteCond %{DOCUMENT_ROOT}/pages/%1/%2/%3/%4/%4.php -f
    RewriteRule ^ pages/%1/%2/%3/%4/%4.php [NC,L]
    

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多