Удалить завершающую косую черту из URL-адреса Apache

#apache #mod-rewrite

Вопрос:

Мне нужно обновить URL-адрес старого веб-сайта, удалив пробел в конце

В настоящее время веб-сайт обслуживается (например) : http://myhost.com/mysite/ и я хотел бы, чтобы это стало http://myhost.com/mysite

Сайт хранится в физическом каталоге /home/user1/mysiteapp, в то время как mysite является псевдонимом

Вот мои файлы конфигурации

Файл местоположения

 DeflateFilterNote Ratio ratio
DeflateCompressionLevel 7

<Location "/mysite/">
  Options None
  AllowOverride None
  Order deny,allow
  Options FollowSymLinks
  Allow from all

  # mod_deflate
  #AddOutputFilterByType DEFLATE text/html text/plain text/xml
        SetOutputFilter DEFLATE
        # Netscape 4.x has some problems...
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        # Netscape 4.06-4.08 have some more problems
        BrowserMatch ^Mozilla/4.0[678] no-gzip
        # MSIE masquerades as Netscape, but it is fine
        # BrowserMatch bMSIE !no-gzip !gzip-only-text/html
        # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
        # the above regex won't work. You can use the following
        # workaround to get the desired effect:
        BrowserMatch bMSI[E] !no-gzip !gzip-only-text/html
        # Don't compress images
        SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
        SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|rar)$ no-gzip dont-vary
        SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary
        # Make sure proxies don't deliver the wrong content
        Header append Vary User-Agent env=!dont-vary
</Location>

# Angular

Alias /mysite /home/user1/mysiteapp
<Directory "/home/user1/mysiteapp">
  Options None
  AllowOverride all
  Order allow,deny
  Allow from all
</Directory>
 

Файл VH

 <VirtualHost *:80>
 ServerName myhost.com
 ServerAlias mysite
  DocumentRoot "/usr/local/apache/htdocs"
  
  # Log config
  CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/access-mysite.%Y-%m-%d.log 86400" combined env=!dontlog
  ErrorLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/error-mysite.%Y-%m-%d.log 86400"
 
  <Directory />
     Order deny,allow
     Allow from all
     Options FollowSymLinks
     AllowOverride All
  </Directory>

  EnableMCPMReceive
  RewriteEngine On
  
  RewriteCond %{REQUEST_METHOD} !^STATUS.*$
  RewriteCond %{REQUEST_METHOD} !^INFO.*$
  RewriteCond %{REQUEST_METHOD} !^CONFIG.*$
  RewriteCond %{REQUEST_METHOD} !^ENABLE-APP$
  RewriteCond %{REQUEST_METHOD} !^DISABLE-APP$
  RewriteCond %{REQUEST_METHOD} !^STOP-APP$
  RewriteCond %{REQUEST_METHOD} !^STOP-APP-RSP$
  RewriteCond %{REQUEST_METHOD} !^REMOVE-APP$
  RewriteCond %{REQUEST_METHOD} !^STATUS-RSP$
  RewriteCond %{REQUEST_METHOD} !^INFO-RSP$
  RewriteCond %{REQUEST_METHOD} !^DUMP$
  RewriteCond %{REQUEST_METHOD} !^DUMP-RSP$
  RewriteCond %{REQUEST_METHOD} !^PING$
  RewriteCond %{REQUEST_METHOD} !^PING-RSP$
  RewriteCond %{REQUEST_URI} !^/test.html.*$
  RewriteCond %{REQUEST_URI} !^/cgi-bin.*$
  RewriteCond %{REQUEST_URI} !^/mod_cluster_manager/.*$
  RewriteCond %{REQUEST_URI} !^/server-status/.*$
  RewriteCond %{REQUEST_URI} !^/maintenance.html$
  RewriteCond %{REQUEST_URI} !^/static_mysite/.*$
  RewriteCond %{REQUEST_URI} !^/mysite/.*$
  RewriteRule ^(.*)/$ /mysite/ [R=302,L,NE]
</VirtualHost>
 

htaccess inside /home/user1/mysiteapp

 <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /mysite/
    RewriteRule ^index.html$ -[L]
    RewriteRule ^refresh.html$ -[L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.html [L]
</IfModule>
 

index.html inside /home/user1/mysiteapp

 <!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8" />
    <title>My Site</title>
    <base href="/mysite/">    <meta content="width=device-width, initial-scale=1" name="viewport" />
    <link href="favicon.png" rel="shortcut icon" type="image/png" />
  <link rel="stylesheet" href="styles.css"></head>

  <body>
    <app-root>
      <div class="app-loading">
        <div class="lds-ripple">
          <div></div>
          <div></div>
        </div>
      </div>
    </app-root>
  <script src="runtime.js" defer></script><script src="polyfills.js" defer></script><script src="scripts.js" defer></script><script src="main.js" defer></script></body>
</html>
 

I tried everything :

  • removing trailing slash in all mysite/ occurences inside the conf files above but then i get a 404
  • добавление правил : RewriteRule ^(.*)/$ /$1 [R=301,L] или RedirectMatch ^/(.*?)/$ /$1 , но затем я получаю «слишком много ошибок при перенаправлении» (но, возможно, я их потерял)
  • добавление DirectorySlash отключено в конфигурации местоположения, но это не имеет никакого эффекта

Как я могу решить эту проблему, пожалуйста ? Большое спасибо

РЕДАКТИРОВАТЬ : я попытался использовать один и простой сайт, чтобы проверить конфигурацию apache по умолчанию, и кажется, что apache действительно добавляет конечное пространство для каждого сайта

 #--------------#
# DEFAULT : IP #
#--------------#
#NameVirtualHost *:80
<VirtualHost *:80>
 ServerName testapp.com
 ServerAlias testapp

 DocumentRoot "/home/test_app"
  
  Alias /testapp /home/test_app
  <Directory "/home/test_app">
  Options None
  AllowOverride all
  Order allow,deny
  Allow from all
</Directory>

 # working
 <Location /testapp/ >
 # not working : 404
 <Location /testapp>
             DirectorySlash Off
          </Location>
</VirtualHost>
 

Также почему местоположение работает только путем добавления завершающей косой черты в конце и больше не работает, удалив ее (404) . Существует ли собственная конфигурация, о которой я не знаю ?

Комментарии:

1. Является /mysite ли физический каталог? Хотя, как ни странно, существуют разные примеры «mysite»… существует URL-путь «/mysite», который является псевдонимом «/home/user1/mysiteapp», но, похоже, в нем есть физический каталог /home/user1/mysiteapp/mysite ? «index.html внутри /home/user1/mysiteapp» — Хотя .htaccess файл, похоже, переписывает запросы на /home/user1/mysiteapp/mysite/index.html ? Как включается «файл местоположения»? Почему это не часть хоста? Просто любопытно, по какой причине вы это делаете? Это чисто косметическое средство?

2.@MrWhite Большое вам спасибо за ваш ответ, пожалуйста, я умоляю вас помочь мне, я застрял на этом весь день, лол. /mysite это виртуальный хост действительно и /home/user1/mysiteapp физический каталог, где все хранится местоположение файла включен в конце httpd.conf , как это: Include conf/mysite_location/*.conf Include conf/mysite_vh/*.conf про то, почему оно структурировано как это, я не могу ответить к сожалению, я при развертывании веб-сайта на своем предприятии собственный веб-сервер, используя некоторые автоматические сценарии, которые будут настройте сайт с пользовательского местоположения и пользовательский файл vhost

3. @MrWhite какие-нибудь советы, пожалуйста ? Спасибо