【问题标题】:Mod Rewrite same format, different sourceMod重写相同的格式,不同的来源
【发布时间】:2012-10-19 14:20:45
【问题描述】:

目前正在为一家公司进行一些 URL 重写,我正在努力让新的 URL 指向正确的文件。

我无权访问 CMS - 页面以两种格式生成:

  • website.com/pressReleases.php?lang=EN
  • website.com/page.php?pagename=About&lang=EN

我已经对每种格式进行了重写,以使它们成为相同的所需格式(website.com/language/pagename):

格式 1 (website.com/pressReleases.php)

RewriteCond %{QUERY_STRING} ^lang=(.*)$
RewriteRule ^(.*).php$ /%1/$1? [L]

格式 2 (website.com/page.php?pagename=About&lang=EN)

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /page.php
RewriteCond %{QUERY_STRING} pagename=([^&]+)&lang=([^&]+)
RewriteRule ^page.php$ /%2/%1? [R=301,L]

问题是两次格式重写的输出是一样的,但是源文件/路径不同。当我创建另一个重定向以将漂亮的 URL 转发到实际源时,它适用于两者:

RewriteRule ^([A-Za-z]+)/([0-9]+)/([a-zA-Z0-9_-]+)$ productSelection.php?    groupid=$2&lang=$1 [L]

有什么方法可以让两种 URL 类型使用相同的格式,但转发到它们的原始路径?我的重写结构是否不正确,从而阻止了这种情况发生?

非常感谢任何帮助!

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    你可以先尝试-f检查php文件,如果失败,使用第二种格式:

    # format 1
    RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)$
    RewriteCond %{DOCUMENT_ROOT}/%2.php -f
    RewriteRule ^/?([^/]+)/(.*)/?$ /$2.php?lang=$1 [L,QSA]
    
    # format 2
    RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)$
    RewriteCond %{DOCUMENT_ROOT}/%2.php !-f
    RewriteRule ^/?([^/]+)/(.*)/?$ /page.php?pagename=$2&lang=$1 [L,QSA]
    

    另外,您需要检查您的第一个 format1 规则中的实际请求:

    RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /([^\ \?\.]+)\.php\?lang=
    RewriteCond %{QUERY_STRING} ^lang=(.*)$
    RewriteRule ^(.*).php$ /%1/$1? [L]
    

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 2015-11-12
      • 2021-10-08
      • 2017-12-24
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多