【问题标题】:.htaccess mod_rewrite causes 500 instead of 404 (infinite internal redirects).htaccess mod_rewrite 导致 500 而不是 404(无限内部重定向)
【发布时间】:2017-05-24 12:12:05
【问题描述】:

我的目标是从 url 中删除 .php 扩展名并创建 Semantic 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/某事

【问题讨论】:

    标签: php apache .htaccess redirect mod-rewrite


    【解决方案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]
    

    【讨论】:

      【解决方案2】:

      感谢@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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-17
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        • 2015-03-03
        • 2020-11-25
        • 1970-01-01
        • 2021-05-21
        相关资源
        最近更新 更多