.htaccess htaccess/修改写入:帮助改进/纠正重写规则

e1xvtsh3  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(131)

我想重写下面的网址(沿着其他一些网址;并非所有文件都在/app文件夹中):

/app/12345/process/789 => /app/process.php?contract_id=12345&id=789
/app/12345/login =>       /app/login.php?contract_id=12345
/app/12345/settings =>    /app/settings.php?contract_id=12345
/app/12345/tags =>        /app/tags.php?contract_id=12345
/app/12345 =>             /app/start.php?contract_id=12345
/app/login =>             /app/login.php

在你对stackoverflow的大力帮助下,我走到了今天:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/process/([^/]+)/?$         app/process.php?contract_id=$1&id=$2 [L,NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/(login|settings|tags)/?$       verfahrensverzeichnis/$2.php?contract_id=$1 [L,NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/?$                         app/start.php?contract_id=$1 [L,NC,QSA]

我需要上次重定向的规则:

/app/login =>             /app/login.php
wnvonmuf

wnvonmuf1#

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/process/([^/]+)/?$         app/process.php?contract_id=$1&id=$2 [L,NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/(login|settings|tags)/?$       verfahrensverzeichnis/$2.php?contract_id=$1 [L,NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/?$                         app/start.php?contract_id=$1 [L,NC,QSA]

对现有规则的一些意见:

  • 所有的文件系统检查看起来都是多余的。我无法想象这些请求中的任何一个都可能Map到一个物理文件或目录?/app/12345可能是文件系统上的一个物理目录吗?文件系统检查相对昂贵,所以如果可能的话最好避免。至少它会导致不必要的代码膨胀。
  • “id”是否仅为数字?您的示例URL使用的是仅为数字的id(第二个和可选的第四个路径段),但您允许在规则中使用“任何内容”。您应该尽可能具体。这自然会避免与您所坚持的规则冲突,即/app/login/app/login.php
  • 您的示例URL没有尾部斜杠,但是您允许在规则中使用可选的尾部斜杠。是否需要这样做?这可能会造成内容重复的问题,因为您现在有两个不同的URL(一个带有尾部斜杠,另一个不带有尾部斜杠)。如果这些URL上可能有尾部斜杠,则应使用规范重定向进行解析(用于SEO),而不是内部重写。
  • 您已经在所有这些规则上使用了NC标志。传入的URL是否真的应该是不同的大小写?同样,这可能会导致重复内容问题,因为/app/12345/process/789/APP/12345/PROCESS/789是两个不同的URL。
  • 第二条规则中的verfahrensverzeichnis是什么?

我需要最后一个重定向的规则:

/app/login =>             /app/login.php

这可以说是所有重写中最简单的一种,然而,目前您的最后一条规则会与此请求冲突,并最终将请求重写为app/start.php?contract_id=login。因此,您需要将此规则放在第一位,或者限制正则表达式,使其只匹配数字ID,如我上面提到的那样(更可取),这自然会避免这种冲突。
因此,考虑到以上几点,您的规则变为:

# Ensure that MultiViews is disabled (must be disabled for these rules to work)
Options -MultiViews

RewriteRule ^app/(\d+)/process/(\d+)$ app/process.php?contract_id=$1&id=$2 [QSA,L]

RewriteRule ^app/(\d+)/(login|settings|tags)$ app/$2.php?contract_id=$1 [QSA,L]

RewriteRule ^app/(\d+)$  app/start.php?contract_id=$1 [QSA,L]

RewriteRule ^app/login$ app/login.php [L]

相关问题