1

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

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

  • website.com/pressReleases.php?lang=EN
  • website.com/page.php?pagename=关于&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 类型使用相同的格式,但转发到它们的原始路径?我是否错误地构造了我的重写以防止这种情况发生?

非常感谢任何帮助!

4

1 回答 1

0

您可以尝试先-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]
于 2012-10-19T22:43:18.620 回答