.htaccess mod_rewrite 导致 500 而不是 404(无限内部重定向)

问题描述 投票:0回答:2

我的目标是从 URL 中删除 .php 扩展名并创建语义 URL 多语言网站。这是我的 .htaccess 规则:

# Turn mod_rewrite on
RewriteEngine On
    
#Remove .php extensions from files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.+?)/?$ /$1.php [L]
    
#Create Semantic url
RewriteRule  ^event/([A-Za-z0-9-\+]+)/([A-Za-z0-9-\+]+)/?$  calendar?region=$1&news_id=$2 [L,NC]
    
#Handle language switch.
RewriteRule ^(ru)/(.*)$  $2?sitelang=2 [L,QSA]
RewriteRule ^(ru)$  $1?sitelang=2 [L,QSA]
RewriteRule ^(en)/(.*)$  $2?sitelang=1 [L,QSA]
RewriteRule ^(en)$  $1?sitelang=1 [L,QSA]
RewriteRule ^(.*)$  $1?sitelang=1 [L,QSA]
    
#404 Document /404.php
ErrorDocument 404 /404

所以我在某些情况下这条规则有效,但也有无效的情况。所以这里是工作的:

  • domain.com/ru/event/region/some-event-name
  • domain.com/event/region/some-event-name

那些不起作用的(当我添加一些东西时,粗体),会导致 500 错误:

  • domain.com/events/region/some-event-name
  • domain.com/events/region/some-event-name/
  • domain.com/event/region/some-event-name/something
php apache .htaccess redirect mod-rewrite
2个回答
1
投票

您需要停止现有文件和目录的规则执行。你的规则如下:

#404 Document /404.php
ErrorDocument 404 /404

# Turn mod_rewrite on
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

#Remove .php extensions from files
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.+?)/?$ /$1.php [L]

#Create Semantic url
RewriteRule ^event/([\w-]+)/([\w-]+)/?$ calendar?region=$1&news_id=$2 [L,NC,QSA]

#Handle language switch.
RewriteRule ^(ru)/(.*)$  $2?sitelang=2 [L,QSA]
RewriteRule ^(ru)$  $1?sitelang=2 [L,QSA]
RewriteRule ^(en)/(.*)$  $2?sitelang=1 [L,QSA]
RewriteRule ^(en)$  $1?sitelang=1 [L,QSA]
RewriteRule ^(.*)$  $1?sitelang=1 [L,QSA]

0
投票

感谢@anubhava 为我指明了正确的方向。在你的帮助下我能够解决我的问题。这是工作解决方案。

#404 Document /404.php
ErrorDocument 404 /404.php

# Turn mod_rewrite on
RewriteEngine On

#Remove .php extensions from files
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.+?)/?$ /$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ - [L]

#Create Semantic url
RewriteRule ^event/([\w-]+)/([\w-]+)/?$ calendar?region=$1&news_id=$2 [L,NC,QSA]

#Handle language switch.
RewriteRule ^(ru)/(.*)$  $2?sitelang=2 [L,QSA]
RewriteRule ^(en)/(.*)$  $2?sitelang=1 [L,QSA]
RewriteRule ^(.*)$  $1?sitelang=1 [L,QSA]
© www.soinside.com 2019 - 2024. All rights reserved.