У меня проблема со слиянием старого сайта Zend с новым приложением Angular 2/4. Я хотел бы вставить мое угловое приложение в качестве другого URL в Zend.
Итак, у меня есть домен http://example.net, которые перенаправляют меня на мой Zend-сайт,
теперь я хочу иметь http://example.net/Angular, которые перенаправляют меня в мое приложение Angular.
В общей папке Zend я создал еще одну и скопировал все скомпилированные файлы из angular2. Все отлично работает, когда я иду в http://example.net/Angular, я могу перемещаться по сайту, используя ссылки, но когда я обновляю или отправляю больше вложенных ссылок, таких как http://example.net/Angular/profile/12 меня перенаправили на Zend 404 страницы.
Угловое приложение .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
Zend .htaccess
Options +FollowSymLinks +ExecCGIphp_value upload_max_filesize 24M
php_value post_max_size 24M
php_value memory_limit 512M
RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
#https:// -> https://www.
php_value safe_mode "0"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} msnbot [NC]
RewriteRule . - [F]
RewriteCond %{HTTP_HOST} ^example.net [NC]
#^ -> https://www.
RewriteRule ^(.*)$ https://www.example.net%{REQUEST_URI} [R=301,L]
#http -> https
# newsletter stats collector
RewriteCond %{REQUEST_URI} ^/ns/[0-9]+/[^/]+$
RewriteRule ^(.*)$ _newsletter_stats.php [L]
RewriteRule ^action/order.php order.php [L]
# newsletter tracker
RewriteCond %{REQUEST_URI} ^/nt/[0-9]+$
RewriteRule ^(.*)$ _newsletter_tracker.php [L]
ErrorDocument 404 /404.htmlRewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_URI} !\.html$
RewriteCond %{REQUEST_URI} !\.pdf$
RewriteRule .* - [L]
RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php [QSA,L]
</IfModule><IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript application/x-javascript
</IfModule>
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|js|php|pl|jpg|png|gif|css)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>
<IfModule mod_setenvif.c>
# 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 already-compressed files
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:avi|mov|mp3|mp4|rm|flv|swf|mp?g)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary
</IfModule>
<FilesMatch ".(ico|jpg|jpeg|png|gif|js|swf|css)$">
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault A604800
Header append Cache-Control "public"</IfModule>
Header unset ETag
FileETag None
</FilesMatch>
Система маршрутизации в этом приложении, вероятно, неизвестна людям, которые закодировали этот сайт, поэтому я хотел бы придерживаться решений htaccess и Angular.
Также я не могу запустить сервер узла или любой другой, чем этот Apache 2 у меня уже есть … Хостинг.
Я определенно рекомендую использовать кличка для углового приложения (даже с точки зрения развертывания, это означает, что вы держите свои проекты и артефакты отдельно).
Первый .htaccess
вы предоставили, вероятно, даже не запрашивается, так как вы запрашиваете document_root /
(будучи вашим приложением ZF), который проверяет, существует ли файл на диске, /Angular/profile/12
не и служит index.php
,
Поэтому другим решением будет добавление еще одного условия в ZF .htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?!Angular/)(.+)$ /index.html/$1 [NC,QSA,L]
#...
</IfModule mod_rewrite.c>
Нечто подобное (не проверено).
Редактировать: как насчет этого
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/Angular/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}/Angular/index.html [L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}/index.php [L]
Опять же, это может потребовать некоторой настройки, и другие решения, такие как псевдонимы или домен для веб-сайта (app.domain.com и api.domain.com), будут намного лучше.
Других решений пока нет …