我一直在寻找解决方案,但只找到一个类似的案例,没有答案(不幸的是)。尽管实施正在发挥作用,但我仍然缺少一个关键方面。
我正在运行一个简单的网站(一个 php 文件),它根据所选的语言和页面加载内容。为了拥有 SEO 友好的 URL,我使用以下 .htaccess 文件:
RewriteEngine On
Options +FollowSymlinks
# 1. Redirect HTTP to HTTPS automatically (only if not in localhost)
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 2. Add a slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^./]+)$ $1/
# 3. Default homepage
RewriteRule ^([^./]+)/$ index.php?lang=$1&page=home
# 4. Language and page
RewriteRule ^([^./]+)/([^./]+)/$ index.php?lang=$1&page=$2
结果:
index.php?lang=en&page=services -> /en/services/
index.php?lang=nl&page=diensten -> /nl/diensten/
...
但是,我希望英语没有语言子目录,而其他语言则保留语言子目录。
index.php?lang=en&page=services -> /services/
index.php?lang=en&page=about -> /about/
...
我可以使用“RedirectMatch 301 /en/(.*) /$1”,但这不是正确的方法。
我如何完成我需要的事情?
像这样:
RewriteEngine On
Options +FollowSymlinks
# 1. Redirect HTTP to HTTPS automatically (only if not in localhost)
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
# 2. Add a slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^./]+)$ $1/
# 3. Default homepage
RewriteRule ^/?$ index.php?lang=en&page=$1 [L,QSA]
# 4. default language to en
RewriteRule ^([^./]+)/$ index.php?lang=en&page=$1 [L,QSA]
# 5. Language and page
RewriteRule ^([^./]+)/([^./]+)/$ index.php?lang=$1&page=$2 [L,QSA]